6

有人告诉我这段代码打印出 29。这是为什么呢?

int *a = 17; 
printf("%d", a+3);
4

5 回答 5

36

因为当您添加到指针时,它会添加对象大小。在这种情况下,对象大小为 4 (sizeof(int) == 4) - 所以 17 + 3 * 4 == 29。

于 2009-12-15T20:51:59.517 回答
13

每个人都知道答案是 23,至少在 6809 上是这样。

a+3 == a + (3 * sizeof(int)) == a + 6 == 17 + 6 == 23
于 2009-12-15T20:57:32.750 回答
11
a+3 == a + (3 * sizeof(int)) == a + 12 == 17 + 12 == 29
于 2009-12-15T20:52:09.220 回答
2

在 C 语言中,指针不能用整数值初始化,唯一的例外是计算结果为零的整数常量表达式。17不满足这个要求。

您的代码无效。它不会“打印”任何东西。这个问题没有任何意义。任何从指针算术的角度来分析这个问题的尝试都是荒谬的,而且只是浪费时间。


ISO/IEC 9899:1999(编程语言 - C)

6.5.16.1 简单赋值

约束

下列其中一项应成立:93)

— 左边的操作数有合格或不合格的算术类型,右边有算术类型;

— 左操作数具有与右操作数兼容的结构或联合类型的限定或非限定版本;

— 两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符;

— 一个操作数是指向对象或不完整类型的指针,另一个是指向 void 的限定或非限定版本的指针,左侧指向的类型具有右侧指向的类型的所有限定符;

— 左操作数是指针,右操作数是空指针常量;或者

— 左操作数的类型为 _Bool,而右操作数是指针。

93)这些约束相对于类型限定符的不对称外观是由于将左值更改为“表达式的值”的转换(在 6.3.2.1 中指定)从表达式的类型类别中删除了任何类型限定符.

于 2009-12-15T23:25:30.357 回答
-2

可以打印任何东西..您正在设置指向内存中位置“17”的指针...

于 2009-12-15T20:54:03.337 回答