当指针指向值3时,C程序返回0

时间:2014-04-08 06:17:53

标签: c pointers

我想在程序结束时,il会打印3但事实上它是0。

任何人都可以解释它是如何发生的吗?

以下是代码:

int arr[3] = {2, 3, 4};
char *p;
p = arr;
p = (char*)((int*)(p)); // two conversion, means nothing, omit
printf("%d, ", *p);     // point to 2, 
p = (int*)(p+1);  // point to 3 ?
printf("%d", *p);
return 0;

4 个答案:

答案 0 :(得分:5)

您正在处理一个整数数组,如一个字符数组。标记为“无意义”的行实际上意味着很多。

当您将char* p递增1时,将指针移位一个字节,但为了指向arr[1],您需要将其递增sizeof(int)个字节。将p声明为int* p,然后p+1将执行您需要的操作。

答案 1 :(得分:3)

由于p的类型为char,p+1指向超过第一个整数开头的一个字节。因此,当您通过解除引用p读取一个字节时,您正在读取包含零字节的整数数组中的位置。

答案 2 :(得分:2)

如果增加指针,则会增加其类型的大小。这里p是字符指针,如果你增加p,它指向下一个字符。由于字符是1个字节,p+1指向p指向的下一个字节。如果p是一个整数指针,p+1将指向代码中的下一个整数i,e 3。

答案 3 :(得分:1)

发生了什么?

以下行以char 格式打印*p 内容(此处为int)。

char *p;
printf("%d, ", *p);

它打印2,因为(当前)机器是little-endian(例如x86)。如果此代码在big-endian机器上运行,则会打印0。 [对于endian-ness,请参阅http://en.wikipedia.org/wiki/Endianness]

练习:如果数组初始化更改为以下内容,那么预期的打印输出是什么?

int arr[3] = {0x1a2b3c4d, 3, 4};

指针递增

我们说我们有

char * pc = 0xA0;
int  * pi = 0xB0;

pc += 1;    // pc = ?
pi += 1:    // pi = ?

pcpi的新值是什么?

由于pc是指向char的指针,+ 1pc增加sizeof(char),即为pi

但是,由于int是指向+ 1的指针,pi会增加sizeof(int) sizeof(int)。在32位系统中,sizeof(int)通常为4,而在64位系统中,pc += 1; // pc = 0xA1 pi += 1: // pi = perhaps 0xB4 or 0xB8 通常为8。

int

谨慎之言

可以尝试知识和好奇心,但在实际代码中,通过将char *转换为{{1}}来访问{{1}}的字节不是一个好主意,它会导致各种各样的端点可移植性问题。