繁体   English   中英

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

[英]C programme return 0 while the pointer point to value 3

我以为程序结束时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;

您正在将整数数组视为char数组。 标记为“没有任何意义”的行实际上意味着很多。

当将char* p递增1时,会将指针移动1个字节,但是要指向arr[1] ,则需要将其sizeof(int)个字节递增。 p声明为int* p ,然后p+1将完成您需要的操作。

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

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

这是怎么回事?

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

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

因为(当前)机器是低端字节序(例如x86),所以它打印2 如果此代码在big-endian机器上运行,则将输出0 [有关字节序,请参阅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的指针,因此+ 1 pc sizeof(char) ,即1。

但是,由于pi是指向int的指针,因此+ 1 pi增加sizeof(int) 在32位系统中, sizeof(int)通常为4,而在64位系统中, sizeof(int)通常为8。

pc += 1;    // pc = 0xA1
pi += 1:    // pi = perhaps 0xB4 or 0xB8

警示语

出于知识和好奇心的考虑可以进行实验,但是在实际代码中,通过将int的字节转换为char *来访问int的字节不是一个好主意,它会导致各种字节序可移植性问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM