[英]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 = ?
pc
和pi
的新值是多少?
由于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.