我很担心这个转换是如何工作的,因为我的代码如下所示,1 2 3 4 5的数组将被转换为1'\ 0'的char数组。这是如何工作的?
#include<stdio.h>
#include<string.h>
#define SIZE 5
int main(){
int array1[SIZE] = { 1, 2, 3, 4, 5 };
int array2[SIZE];
char* array = (char*)array1;
int i = 0;
while(array[i] != '\0'){
printf("%d ", array[i]);
i++;
}
}
答案 0 :(得分:4)
你在这里所做的是被称为类型的双关语并且皱着眉头。 [编辑>在此处添加Olaf的评论:这是因为代码中的 cast 发生在指针上,而不是指向它指向的数据上。]根据您的描述,你是一个小端架构 - 假设它是32位,int
为1将占用4个字节(32位)并表示如下:
{ 1, 0, 0, 0 }
所以整个数组被解释为一系列字节,看起来像
{ 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, ... }
请注意,这实际上取决于您的实现和体系结构,因此请不要执行 type punning 。这就是为什么标准声明通过与声明的一个未定义行为不同类型的指针访问存储值的原因。 (或者,在这种情况下,作为char *
的类型惩罚是允许一些必要用例,实现定义的行为的例外 - 您仍然可以在不同的环境中获得不同的读数)< / p>
答案 1 :(得分:1)
结果是实现定义。这取决于您机器上的endianess;在x86的情况下,它是小端的。
array
是指向array1
的指针。由于您的计算机显然是小端(我猜x86),array1
内部看起来像这样,假设sizeof(int)
等于4
:
0x01 | 0x00 | 0x00 | 0x00 | 0x02 | 0x00 | 0x00 | 0x00 | 0x03 | ...
因此,如您所见,第一个char
的值为0x01
,后跟0x00
。因此结果。
答案 2 :(得分:0)
因为int的大小是4个字节,但char的大小是1个字节。在这种情况下,当您将char转换为int(1字节到4)时,您将从1 int获得4个字符。 我们试试
#include<stdio.h>
#include<string.h>
#define SIZE 5
int main(){
int array1[SIZE] = { 1, 2, 3, 4, 5 };
int array2[SIZE];
char* array = (char*)array1;
int i = 0;
while(array[i] != '\0'){
printf("%d ", array[i]);
i=i+4;
}
}