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]);
}