任何人都请详细说明这里发生了什么?
int main()
{
int **p = 0;
//p=? and why| *p=? and why|**p=? and why
++p;
//p=? and why| *p=? and why|**p=? and why
printf("%d\n", p);
return 1;
}
输出: -
答案 0 :(得分:7)
首先,p
是指向整数指针的指针。
int **p = 0;
p
= 0,*p
=无,**p
=少于零。
++p;
与p = p + 1相同。表示指向指向int 的指针的大小。指针基本上是,至少在你的操作系统上,32位长度(4字节)。 p
现在指向0之后的4个字节。p
的值 4 。
答案 1 :(得分:6)
p
是指针指向int
的指针。它被初始化为0
,即它是一个空指针。
然后递增以指向内存中的下一个连续指针 - { - 1}}。 * 下一个指针将位于地址4,因为在您的平台上的大小为指针是4个字节。
然后printf将指针值解释为整数,因此显示“4”。
*但请注意,这是现在未定义的行为。
答案 2 :(得分:4)
很明显。你有一个指向int的指针(int **p
表示指向int的指针),它实际上保存地址 0)。在您的体系结构中,指针本身的长度为32位(4字节),因此递增p
会得到p + 4,即0 + 4 = 4.
去获得一本不错的C书并了解指针算法。你将度过余生! :)
答案 3 :(得分:3)
++p
实际上是未定义的行为,但是你的实现似乎发生的事情是sizeof(int*)
是4,空指针是地址0.回想一下指针增量,当它不是UB时,向地址添加一些字节数等于referand类型的大小。因此,当您获取类型为int**
的空指针(因此参考类型为int*
)并递增它时,您最终会遇到地址4
,这并不奇怪。这不能保证。
当%d
格式需要int
时,传递指针也是未定义的行为,但似乎int
和int**
的表示足够兼容,并且对你的实现调用约定的varargs对它们进行了类似的处理,它已成功打印4
。对sizeof(int) == sizeof(int**)
的实现而言,这也不是很令人惊讶,但也不能保证。
当然,因为它是未定义的行为,所以你可以看到其他可能的解释。
答案 4 :(得分:0)
p是指向int的指针。它被初始化为0,即NULL。
当你递增它时,它现在指向int的下一个指针,在32位系统上,它恰好是4。