【发布时间】:2014-01-26 04:19:56
【问题描述】:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int x[][2] = { {1,2},{3,4},{5,6},{7,8} };
int i, j;
printf("%d \n", x);
for (i = 0; i <= 3; i++)
{
printf("%u %u\n", x + i, *(x + i));
}
for (i = 0; i <= 3; i++)
{
for (j = 0; j <= 1;j++)
printf("%u %u\n", *(x + i + j), *(*(x + i) + j));
}
return 0;
}
输出:
3217317712 3217317712
3217317720 3217317720
3217317728 3217317728
3217317736 3217317736
3217317712 1
3217317720 2
3217317720 3
3217317728 4
3217317728 5
3217317736 6
3217317736 7
3217317744 8
现在,当我打印 (x+i) 和 *(x+i) 时,结果相同。
但是,当我打印 *(x+i+j) 和 *(*(x+i)+j) 时,它给了我不同的结果。
如果(x+i) 和*(x+i) 被评估为相同的值,为什么我在第二种情况下会得到不同的结果?
【问题讨论】:
-
您正在打印指针,但告诉 printf 它们是整数。这是未定义的行为,然后可能会发生各种奇怪的事情。
-
@ThomasPadron-McCarthy 格式化指向整数的指针会在 64 位系统中丢失一些位。但这不是未定义的行为。
-
@oyss:我确实相信给 printf 提供不一致的参数会产生未定义的行为。引用标准(委员会草案——2007 年 9 月 [原文如此] 7,第 280 页)(我的免费草稿副本):“如果任何参数不是相应转换规范的正确类型,则行为未定义。”
-
为什么 (x+i) 和 *(x+i) 没有区别?我就是不明白!
-
阅读comp.lang.c FAQ的第6部分。
标签: c arrays pointers dereference