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

pointer dereference: actual mechanism of compiler

本文关键字:机制 编译器 引用 指针      更新时间:2023-10-16

我对解引用指针的实际机制(编译器实际做什么)的理解有点挣扎。

我通过谷歌和这里的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**型?

是,pptrint**类型。int**是指向int指针的指针。所以*pptr的类型是int*, **pptr的类型是int

为什么我不能写:int* pptr = &ptr ?

ptr的类型是int*。因此,&ptr的类型是int**,这与int*类型的变量不兼容。指向int的指针与指向int指针是不同的类型。