C数组中的指针应用

Pointers application in C array

我准确地写下了下面的代码, 它应该产生“2036、2036、2036”,但每当我反复按下“运行”按钮时,它都会返回 8-9 位奇怪的随机值。

有人知道吗?

 #include <stdio.h>
 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);
  } 

您声明了一个 two-dimensional 数组

unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6}, 
                        {7, 8, 9}, {10, 11, 12}};

在调用 pf 的参数表达式中使用 printf

printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);

它被隐式转换为指向其类型 unsigned int ( * )[3] 的第一个元素的指针。

因此 x + 3 是一个指向数组第四行的指针,您正尝试将其输出为导致未定义行为的无符号整数。

表达式 *( x + 3 ) 生成数组的第四行,该行隐式转换为指向该行第一个元素的指针。因此,数组第四行的第一个元素的地址作为无符号整数输出,再次调用未定义的行为。

表达式*(x+2)给出第三行的第一个元素,如上所述。所以表达式 *(x+2)+3 产生第三行最后一个元素之后的内存地址。

只需重写 printf 的调用即可

printf("%p, %u, %u\n", ( void * )( x+3 ), **(x+3), **(x+2)+3);

然后你会得到第四行的地址,第四行第一个元素的值(10)和第三行第一个元素的值(7)加上3即10。

否则你需要写

printf("%p, %p, %p\n", ( void * )( x+3 ), ( void * )( *(x+3) ), ( void * )( *(x+2)+3 ) );

输出指针类型的原始表达式