C中的双指针

Double pointer in C

本文关键字:指针      更新时间:2023-10-16

谁能解释一下这里发生了什么?

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("%dn", p);
return 1;
}
输出

: -

  • 4(为什么?)

首先,p是一个指向整型指针的指针。

int **p = 0;

p = 0, *p = 0, **p = 0

++p;

与p = p + 1相同。表示指向另一个指向整型的指针的大小。指针基本上,至少在你的操作系统上,32位长度(4字节)。p现在在0后4个字节。p的值为4

p是指向- int的指针。它被初始化为0,即它是一个空指针。

它被递增到指向内存中下一个连续的指向- int的指针。*下一个指针将位于地址4,因为在您的平台上指针的大小是4字节。

然后printf将指针值解释为整数,因此显示"4"。

*注意,这现在是未定义的行为

很清楚。你有一个指向int型指针的指针(int **p意味着指向int型指针的指针),它实际上保存着地址 0)。在你的体系结构中,指针本身是32位(4字节)长,所以增加p会给你p+4,即0+4 = 4。

去找一本好的C书,学习指针算术。你的余生都会快乐的!:)

++p实际上是未定义的行为,但似乎在您的实现中发生的是sizeof(int*)是4,空指针是地址0。回想一下,当指针递增不是UB时,它向地址添加的字节数等于referand类型的大小。因此,当您接受类型为int**的空指针(因此referand类型为int*)并对其进行增量时,您最终会在地址4处结束,这并不奇怪。只是不能保证。

%d格式期望int时传递指针也是未定义的行为,但是看起来intint**的表示是足够兼容的,并且在实现上的变量调用约定对它们进行了足够相似的处理,它已经成功地打印了4。这对于sizeof(int) == sizeof(int**)的实现也不奇怪,但也不保证。

当然,由于这是未定义的行为,对于您所看到的,还有其他可能的解释

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

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