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