C中的双指针
Double pointer in C
谁能解释一下这里发生了什么?
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
时传递指针也是未定义的行为,但是看起来int
和int**
的表示是足够兼容的,并且在实现上的变量调用约定对它们进行了足够相似的处理,它已经成功地打印了4
。这对于sizeof(int) == sizeof(int**)
的实现也不奇怪,但也不保证。
当然,由于这是未定义的行为,对于您所看到的,还有其他可能的解释
p是指向int型指针的指针。它被初始化为0,即NULL。
当你增加它时,它现在指向下一个指向int的指针,在32位系统上,它恰好是4。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错