繁体   English   中英

C中的%u格式说明符

[英]%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.

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