C++ 将整型*转换为常数短整型*

C++ 将整型*转换为常数短整型*,c++,pointers,casting,int,C++,Pointers,Casting,Int,我使用的函数来自一个库,其中一个最重要的函数接受类型为const short int*的参数。我所看到的是int*,我想知道是否有办法将int*转换成const short int*。以下代码片段突出显示了我面临的问题: /* simple program to convert int* to const short* */ #include <stdio.h> #include <iostream> #include <stdlib.h

我使用的函数来自一个库,其中一个最重要的函数接受类型为
const short int*
的参数。我所看到的是
int*
,我想知道是否有办法将
int*
转换成
const short int*
。以下代码片段突出显示了我面临的问题:

/* simple program to convert int* to const short* */


    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>

    void disp(const short* arr, int len) {

      int i = 0;
      for(i = 0; i < len; i++) {
        printf("ith index = %hd\n", arr[i]);
      }
    }

    int main(int argc, char* argv[]) {

      int len = 10, i = 0;
      int *arr = (int *) malloc(sizeof(int) * len);

      for(i = 0; i < len; i++) {
        arr[i] = i;
      }

      disp(arr, len);

      return 0;
    }
  • 我试过康斯特·内斯的演员阵容。函数调用看起来像:
    disp(const_cast arr,len)
    这导致编译时出错 我的问题:
    1.为什么方法1中的输出如此奇怪?那边发生了什么事?
    2.我看到了一些使用const cast-in方法2删除const ness的示例。我不知道如何添加相同的内容。
    3.有没有办法将
    int*
    转换成
    const short int*


    附言:如果以前有人问过类似的问题,请告诉我。我在谷歌上搜索了一下,没有找到任何具体的信息

    一般来说,从
    int*
    强制转换到
    short*
    将不会产生有用的行为(事实上,如果尝试取消引用结果指针,可能会导致未定义的行为)。它们是指向根本不同类型的指针


    如果你的函数需要一个指向一堆
    short
    s的指针,那么这就是你需要给它的。您需要创建一个
    short
    数组,并从原始数组中填充它。

    强制转换几乎总是设计问题的标志。如果您有一个函数采用
    short*
    const
    或其他形式),则需要使用
    short*
    调用它。因此,与其分配
    int
    数组,不如分配
    short
    数组


    当您将
    int*
    转换为
    short*
    时,您告诉编译器假装
    int*
    实际上是指向
    short
    的指针。它可以做到这一点,但在对编译器撒谎之后,你要对后果负责。

    对,因此在许多环境中,
    short
    的大小不同于
    int
    (不必如此,当然也有编译器,例如,有16位
    int
    和16位
    short

    因此,以这种方式投射指针所得到的结果是,a)未定义的行为,以及b)除非您确切地知道自己在做什么,否则很可能不是您想要的

    代码的输出看起来与我期望的完全一致,所以很明显,您没有告诉我们您正在尝试做什么

    编辑:请注意,由于指针“取决于大小”,如果将一个大小的指针投射到另一个大小不同的类型的指针,则数据的对齐方式将是错误的,这就是为什么输出中的其他值都是零-因为
    int
    通常为4个字节,
    short
    为2个字节,指针将“单步执行”每个索引2个字节,(因此
    arr[i]
    将是原始
    arr
    +i*2个字节。
    int*arr
    的“步长”为4个字节,因此
    arr+i*4
    字节。根据您的整数值,您将从中获得一些“半个整数值”——因为您的数字很小,所以这是零

    因此,虽然编译器正在执行您要求它执行的操作:将指向
    short
    的指针指向包含
    int
    的内存块,但它不会执行您期望它执行的操作,即将每个
    int
    转换为
    short
    。要执行此操作,您必须执行以下操作之一:

    short **sarr = malloc(sizof(short *) * 10); 
    
    for(i = 0; i < 10; i++)
    {
        sarr[i] = (short *)(&arr[i]);       // This may well not work, since you get the "wrong half" of the int.
    }
    
    但是它取决于“字节顺序”(大端或小端),所以它不可移植,在一般代码中这样做是非常糟糕的编码风格

    或: short*sarr=malloc(sizof(short*)*10)

    (i=0;i<10;i++)的
    
    {
    sarr[i]=(短)(arr[i]);
    }
    
    第二种方法的工作原理是将整数数组的副本复制到一个短数组中。这也不取决于内容的存储顺序或诸如此类的内容。当然,如果
    arr[i]
    中的值大于
    short
    中可以容纳的值,则不会得到与
    arr[i]相同的值
    在您的
    短片中


    在这两种情况下,不要忘记在不再需要阵列时释放阵列。

    回答问题1
    输出一点也不奇怪。显然,编译器为每个
    int
    分配了4个字节,每个
    short
    分配了2个字节。因此,您的
    arr
    的大小为10x4=40个字节。当您为其分配数字0..9时,内存中有一个字符(每个字节一个字符,按
    int
    分组):

    0
    01
    02
    03
    04

    当您将
    arr
    转换为
    short
    时,内存现在“分组”为2个字节:

    0 0
    0 0
    0 0
    01
    0 0
    02
    0 0

    我希望您能看到效果,以及为什么在分配的数字之间突然出现
    0
    -s

    对问题2的回答
    函数
    display
    const
    的声明仅意味着
    arr
    的内容在执行
    display
    期间不会更改。调用
    display
    不需要显式将参数强制转换为
    const
    数组

    对问题3的回答

    请看@Pete和@Mats的答案,你应该从你的代码中删除强制转换。虽然我写了一个貌似的答案,但如果你解释一下你实际上想要实现什么,可能会有所帮助-这听起来像是一个XY问题,你想做X,你认为应该由Y来解决,所以你问Yode代码片段准确地反映了我所要做的。.要想找到一种方法将
    int*
    转换成
    const short int int*
    。那么,您的代码工作得很好-除非
    short **sarr = malloc(sizof(short *) * 10); 
    
    for(i = 0; i < 10; i++)
    {
        sarr[i] = (short *)(&arr[i]);       // This may well not work, since you get the "wrong half" of the int.
    }
    
         sarr[i] = (short *)(&arr[i])+1;      // Get second half of int.
    
    for(i = 0; i < 10; i++)
    {
        sarr[i] = (short)(arr[i]);
    }