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

时间:2013-04-21 21:01:19

标签: c++ pointers

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

我通过谷歌和在这里的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;
}

在我的机器上给了我这个:

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 =&amp; a;告诉编译器“变量”ptr的类型是“int *”(指向整数的指针;即内存地址) 因此,当我编写* ptr时,编译器获取ptr的值,将其作为地址并将解析存储在该地址的内容作为int类型。

到目前为止,非常好。

但是int ** pptr =&amp; ptr对编译器意味着什么呢? 这是否意味着pptr的类型为“int **”? 或者它仍然意味着pptr的类型为“int *”(我的意思是,&amp; ptr和&amp; a一样好的内存地址)

第二个星号实际上对编译器意味着什么,为什么我不能写:“int * pptr =&amp; ptr” (至少g ++不会让我这样做)

非常感谢你的努力, 如果事情对我来说似乎不合逻辑,它会伤害我的大脑: - ))

1 个答案:

答案 0 :(得分:2)

  

但是int** pptr = &ptr对编译器实际意味着什么?这是否意味着pptr属于int**类型?

是的,pptr的类型为int**int**指向int 指针的指针。因此*pptr的类型为int*,而**pptr的类型为int

  

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

好吧,ptr的类型为int*。因此,&ptr的类型int**int*类型的变量不兼容。指向int 的指针与指向int 的指针的指针是不同类型的东西。