C++ 指针解引用:编译器的实际机制

C++ 指针解引用:编译器的实际机制,c++,pointers,C++,Pointers,我在理解指针解引用的实际机制(编译器的实际功能)方面有点困难 我在谷歌上和stackoverflow上都发了很多红包,但我还没完全弄明白:-( 我编写了一个带有多个指针的简单程序: #include <iostream> int main() { int a = 5; int* ptr = &a; int** pptr = &ptr; int*** ppptr = &pptr; int**** p4tr = &

我在理解指针解引用的实际机制(编译器的实际功能)方面有点困难

我在谷歌上和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 = *ptr\nint*** ppptr = &pptr\nint**** p4tr= &ppptr\n" << 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;
}
我发现,解引用是如何工作的: int*ptr=&a;告诉编译器“变量”ptr的类型为“int*”(指向整数的指针;即内存地址) 因此,当我写*ptr时,编译器将ptr的值作为地址,并将存储在该地址的内容解释为int类型

到目前为止,一切顺利

但是int**pptr=&ptr对编译器实际意味着什么? 这是否意味着pptr属于“int**”类型? 或者它仍然意味着pptr的类型是“int*”(我的意思是,&ptr是一个与&a一样好的内存地址)

第二个asterix对编译器的实际意义是什么?为什么我不能写:“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++大师的大脑。不要试图成为一个指针,指针只是一个地址。你可以把某人的地址写在一张纸上。然后你可以在另一张纸上写下你把论文放在哪里。@H2CO3“三星程序员”…这让我白天(晚上)!好啊这似乎合乎逻辑。我仍然有点困惑,因为这本书*说“int*”只是一种类型,用来告诉编译器下面的数字是地址(就像“char”用来告诉编译器它是一个字母)。这本书错了吗?因为int**会与本书的定义相矛盾,不是吗?*这正是正文:
int*
是指向
int
的指针
int**
是指向
int*
的指针
int***
是指向
int**
的指针。等等我不太确定你认为什么是矛盾的。哇……课文有点纠结了。以下是实际版本:我仍然没有看到任何矛盾
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