[英]%u format Specifier in C
我编译了这段代码,它给出了'&x'值的3倍。 也就是说,如果&x = 2000,它将打印2036次三遍。 我想知道这种行为的原因,假设整数需要4个字节的内存。
#include <stdio.h>
int main(void) {
// your code goes here
int x[4][3] = {0};
printf("%u %u %u", x+3, *(x+3), *(x+2)+3);
return 0;
}
该代码的输出是什么
通过使用转换说明符为unsigned
转换指针值来显示指针值,代码引发未定义的行为,可能会发生任何事情。
要打印指针值,请使用转换说明符p
。
数组的地址及其第一个元素的地址相同。 但是,指向它们的指针的类型不同。
x
以及x + 3
的类型为int (*)[3]
,它指向三个int
的数组。 假设int
的大小为4
,则三个int
的数组的大小为12
。
将x
(指向int (*)[3]
的指针)增加三个元素,其结果是x
指向的地址超出3 * 12
个字节。 这称为指针算术。
因此,您正在滥用格式说明符并调用未定义的行为。 在那时,发生的事情是武断且无趣的。
如果要打印指针,请使用%p
说明符。
x是指向指针数组的指针。 指针数组具有4个元素。 这四个元素中的每一个都指向3个整数。
因此,如果x = 2000,
x [0] = 2000,x [1] = 2012,x [2] = 2024,x [3] = 2036。
因此,
x + 3 = 2036(因为x是数组指针,并且每次增加12。)
*(x + 3)= x [3] = 2036。
*(x + 2)+3 = x [2] + 3 = 2024 + 3 * 4 = 2036。
因此,输出将是三个相同的数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.