指针在C数组中的应用



我准确地写下了下面的代码,并且它应该产生";203620362036";但每当我按下"0"时,它总是返回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);
} 

您声明了一个二维数组

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

用于调用printf中的参数表达式

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

它被隐式地转换为指向其类型为CCD_ 2的第一元素的指针。

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

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

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

只需像一样重写printf的调用

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

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

否则你需要写

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

以输出具有指针类型的原始表达式。

最新更新