我想在程序结束时,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;
答案 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 = ?
pc
和pi
的新值是什么?
由于pc
是指向char
的指针,+ 1
按pc
增加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}}的字节不是一个好主意,它会导致各种各样的端点可移植性问题。