指针解引用:编译器的实际机制
pointer dereference: actual mechanism of compiler
我对解引用指针的实际机制(编译器实际做什么)的理解有点挣扎。
我通过谷歌和这里的stackoverflow读了很多,但我还不能完全得到它:-(
我写了一个带有多个指针的简单程序:
#include <iostream>
int main()
{
int a = 5;
int* ptr = &a;
int** pptr = &ptr;
int*** ppptr = &pptr;
int**** p4tr = &ppptr;
std::cout << "a = 5 nint*ptr = &a nint** pptr = *ptrnint*** ppptr = &pptrnint**** p4tr= &ppptrn" << std::endl;
std::cout << "a: " << a << std::endl;
std::cout << "&a: " << &a << std::endl << std::endl;
std::cout << "ptr: " << ptr << std::endl;
std::cout << "*ptr: " << *ptr << std::endl;
std::cout << "&ptr: " << &ptr << std::endl << std::endl;
std::cout << "pptr: " << pptr << std::endl;
std::cout << "*ptr: " << *pptr << std::endl;
std::cout << "**pptr: "<< **pptr << std::endl;
std::cout << "&pptr: " << &pptr << std::endl << std::endl;
std::cout << "ppptr: " << ppptr << std::endl;
std::cout << "*ppptr: " << *ppptr << std::endl;
std::cout << "**pptr: " << **ppptr << std::endl;
std::cout << "***pptr: " << ***ppptr << std::endl;
std::cout<< "&pptr: " << &ppptr << std::endl << std::endl;
std::cout << "p4tr: " << p4tr<< std::endl;
std::cout << "*p4tr: " << *p4tr<< std::endl;
std::cout << "**p4tr: " << **p4tr<< std::endl;
std::cout << "***p4tr: " << ***p4tr<< std::endl;
std::cout << "****p4tr: " << ****p4tr<< std::endl;
std::cout << "&p4tr: " << &p4tr<< std::endl << std::endl;
return 0;
}
这在我的机器上得到了这个:
a = 5
int*ptr = &a
int** pptr = *ptr
int*** ppptr = &pptr
int**** p4tr= &ppptr
a: 5
&a: 0x7fffe4db870c
ptr: 0x7fffe4db870c
*ptr: 5
&ptr: 0x7fffe4db8700
pptr: 0x7fffe4db8700
*ptr: 0x7fffe4db870c
**pptr: 5
&pptr: 0x7fffe4db86f8
ppptr: 0x7fffe4db86f8
*ppptr: 0x7fffe4db8700
**pptr: 0x7fffe4db870c
***pptr: 5
&pptr: 0x7fffe4db86f0
p4tr: 0x7fffe4db86f0
*p4tr: 0x7fffe4db86f8
**p4tr: 0x7fffe4db8700
***p4tr: 0x7fffe4db870c
****p4tr: 5
&p4tr: 0x7fffe4db86e8
我发现,解引用是如何工作的:Int * PTR = a;告诉编译器"变量"PTR的类型是"int*"(指向整型数的指针;即内存地址)因此,当我写*ptr时,编译器接受ptr的值,将其作为地址,并将存储在该地址中的内容解释为int类型。
到目前为止,一切顺利。
但是int** pptr = &ptr对编译器实际上意味着什么?这是否意味着pptr的类型是"int**"?或者它仍然意味着PPTR是"int*"类型(我的意思是,&ptr是和&a一样好的内存地址)
第二个星号对编译器到底意味着什么?为什么我不能这样写:"int* pptr = &ptr"(至少g++不会让我那样做)
非常感谢你的努力,如果事情对我来说不合逻辑,它会伤害我的大脑:-))
但是
int** pptr = &ptr
对编译器实际上意味着什么?是否表示pptr为int**
型?
是,pptr
为int**
类型。int**
是指向int指针的指针。所以*pptr
的类型是int*
, **pptr
的类型是int
。
为什么我不能写:
int* pptr = &ptr
?
ptr
的类型是int*
。因此,&ptr
的类型是int**
,这与int*
类型的变量不兼容。指向int的指针与指向int的指针是不同的类型。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 指针解引用:编译器的实际机制