1

我对取消引用指针的实际机制(编译器实际执行的操作)的理解有点挣扎。

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

到目前为止,一切都很好。

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

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

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

4

1 回答 1

2

但是int** pptr = &ptr对编译器来说实际上意味着什么?这是否意味着 pptr 是 type int**

是的,pptr是类型int**。Andint**指向 int 的指针*pptr有 type ,int***pptr有 type int

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

嗯,ptr有类型int*。与&ptr类型int**变量不兼容的类型也是如此int*指向 int指针与指向 int的指针是不同类型的东西。

于 2013-04-21T21:05:18.183 回答