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 ) );
输出指针类型的原始表达式
我准确地写下了下面的代码, 它应该产生“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 ) );
输出指针类型的原始表达式