C\C++指针以及*和&
1、代码
#include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { int a=123; //&a表示a在内存中的地址,也就是123在内存中的地址 cout<<"a: "<<a<<endl<<"a's address:"<<&a<<endl;//123 0x68fd7c //此时p是一个指针,指向a所在的位置 int *p=&a; cout<<"p: "<<p<<endl; //0x68fd7c //声明p之后,在p之前添加*表示p指向内存的值 cout<<"p's value: "<<*p<<endl; //123 //同时p也是 一个变量,在内存中也有一个地址储存它,但其地址不是a的地址 cout<<"p's address: "<<&p<<endl; //0x68fd70 //试试*&组合使用是什么效果 cout<<"*&p: "<<*&p<<endl; //0x68fd7c //&p是一个内存地址,*&p表示&p指向地址内存空间的值,在这里表示a的地址 cout<<"**&p: "<<**&p<<endl; //123 return 0; }
2、地址示意图
3、相关打印
只需要明白一个事:*是取值符号,&是取地址符号。
cout<<a 打印a的值,123
cout<<&a 打印a的地址,0x68fd7c
cout<<p 打印p的值,而p存的就是a的地址,0x68fd7c,故cout<<p等于cout<<&a
cout<<*p p的值是0x68fd7c,对这个地址取值就是a的值:123
cout<<&p 取p的地址,打印0x68fd70
cout<<*&p 根据操作符优先级,这里应该从右往左进行运算,先对p进行取地址(&)得到0x68fd70,再对这个地址(*)取值得到0x68fd7c
cout<<&*p 先对p进行取值,得到123,再对这个123的地址取值,得到0x68fd7c
cout<<**&p 先对p进行取地址,得到0x68fd70,再对此地址取值得到0x68fd7c,再次取值得到123
以前都是靠运气猜测,现在总该明白了吧....
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html