有人告诉我这段代码打印出29.为什么会这样?
int *a = 17;
printf("%d", a+3);
答案 0 :(得分:36)
因为当您添加到指针时,它会添加对象大小。在这种情况下,对象大小为4(sizeof(int)== 4) - 所以17 + 3 * 4 == 29.
答案 1 :(得分:13)
每个人都知道答案是23,至少在6809上。
a+3 == a + (3 * sizeof(int)) == a + 6 == 17 + 6 == 23
答案 2 :(得分:11)
a+3 == a + (3 * sizeof(int)) == a + 12 == 17 + 12 == 29
答案 3 :(得分:2)
在C语言中,指针不能用积分值初始化,唯一的例外是积分常数表达式,其值为整数零。 17
不符合该要求。
您的代码无效。它不会“打印”任何东西。这个问题没有任何意义。从指针算术的角度来分析这个问题的任何尝试都是荒谬的,只是浪费时间。
6.5.16.1简单分配
约束
以下其中一项应成立: 93)
- 左操作数具有限定或非限定算术类型,右边具有 算术类型;
- 左操作数具有结构或联合类型的限定或非限定版本 兼容权利的类型;
- 两个操作数都是指向兼容类型的限定或非限定版本的指针, 并且左边指向的类型具有指向的类型的所有限定符 权;
- 一个操作数是指向对象或不完整类型的指针,另一个是指向a的指针 void的限定或不合格版本,左边指向的类型全部 右边指出的类型的限定符;
- 左操作数是指针,右边是空指针常量;或
- 左操作数的类型为_Bool,右侧是指针。
93)这些约束对于类型限定符的不对称外观是由于转换 (在6.3.2.1中指定)将lvalues更改为''删除任何类型的表达式''的值 表达式类型类别中的限定符。
答案 4 :(得分:-2)
可以打印任何内容..您正在设置指向内存中位置“17”的指针...