C中的双指针

时间:2011-09-15 09:40:32

标签: c++ c pointers double-pointer

任何人都请详细说明这里发生了什么?

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;
}

输出: -

  • 4(为什么?)

5 个答案:

答案 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时,传递指针也是未定义的行为,但似乎intint**的表示足够兼容,并且对你的实现调用约定的varargs对它们进行了类似的处理,它已成功打印4。对sizeof(int) == sizeof(int**)的实现而言,这也不是很令人惊讶,但也不能保证。

当然,因为它是未定义的行为,所以你可以看到其他可能的解释。

答案 4 :(得分:0)

p是指向int的指针。它被初始化为0,即NULL。

当你递增它时,它现在指向int的下一个指针,在32位系统上,它恰好是4。