[英]The outputs of my program are confusing
我有这样的代码
int main ()
{
unsigned int x [4] [3] =
{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
printf("%u, %u, %u", x + 3, * (x + 3), * (x + 2) + 3);
}
这三个值的输出都相同,谁能告诉我原因。
首先-正如其他人指出的-您需要使用正确的格式说明符,并将这些值转换为指针。
现在,为什么它们都赋予相同的价值。
这里x是一个数组。 并且其元素的类型是unsigned int[3]
。 即x
是一个unsigned int[3]
数组。
首先, x + 3
给出数组中第四个元素的地址。 那是{10, 11, 12}
的地址。 该数组在内存中的地址将是其数组中第一个元素的地址。 那是内存中的10
地址。 注意,该值为int (*) [3]
,即address of an unsigned int[3] array
。
其次, * (x + 3)
等效于x [3],它是第四个元素,它是unsigned int[3]
。 它是数组{10, 11, 12}
。 该值指向数组{10, 11, 12}
的第一个元素。 也就是说,此值指向10
。 请注意,此值是unsigned int[3]
。
第三*(x+2) + 3
:这里*(x + 2)
等效于x[2]
,它是一个unsigned int[3]
,它是{7, 8, 9}
数组,当您执行+ 3
您再次得到10
的地址。 请注意,此值是unsigned int[3]
。
因此,在所有三种情况下,您都会看到结果是内存中的相同地址,即存储10
的地址-即使您在不同的时间代表不同的事物,也是如此。 unsigned int (*)[3]
unsigned int[3]
,第二和第三是unsigned int[3]
。
提炼的未定义行为:
printf("%u, %u, %u", x + 3, * (x + 3), * (x + 2) + 3);
所有其他参数都必须是unsigned int
,但2d也是unsigned int (*)[3]
,3d也是unsigned int *
,第4个也是unsigned int *
。
您得到错误的值,因为您执行了错误的指针运算。
x
的类型为unsigned int[4][3]
,它是一个长度为4的数组,每个成员本身就是一个长度为3的数组。
那么x+3
什么? 这是在最后一个成员的地址x
(记得成员x
是数组 )。
因此, *(x+3)
本身就是一个数组。 但是,当将数组作为函数参数传递给数组时会发生什么呢? 它们变成指针。 所以你看到,数组中的第一个元素,通过在错误的类型说明符错位的地址printf
。
好的,让我们进入元素x[2][3]
。 这将是*(*(x+2)+3)
这样的表达式,它总共等效于*(&x[0][0] + 2*3 + 3)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.