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

 

以前都是靠运气猜测,现在总该明白了吧....

posted @ 2016-07-18 14:19  朱小勇  阅读(348)  评论(0编辑  收藏  举报