我对解释指针的实际机制(编译器实际做了什么)的理解有点挣扎。
我通过谷歌和在这里的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 ++不会让我这样做)
非常感谢你的努力, 如果事情对我来说似乎不合逻辑,它会伤害我的大脑: - ))
答案 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 的指针的指针是不同类型的东西。