C++指针图解详解

#include<iostream>
using namespace std;
void swap1(int x,int y);
void swap2(int *px,int *py);
void swap3(int &x,int &y);
int main(){
    int a=1,b=2;
    int *pa=&a,*pb=&b;    /*定义的指针变量的时候,也就是说指针变量前面有int,float,char等关键字的时候。
                           *pa并不表示指针变量,*是指一个指针变量的标志,其实pa才表示指针变量。
                           当没有int,float,char等关键字的时候,我们试着打印一下*pa,它会打印出一个a的值,那就是1,
                           这个表示a的地址对应的值,然后再打印一下pa,它会打印出一个地址就是a的地址,
                           坦白说,"int *pa=&a"里面的*pa和直接写个"*pa"是不同的意思!*/
                           /*我们可以理解为“int *pa=&a”里面的“*pa”和单独的”pa“是一样的意思,都表示地址; 单独的“*pa”表示地址a对应的值*/
             //*pa,pa,&pa三者的含义是什么?
             //cout<<*pa;打印的是a的地址对应的值,就是1。
             //cout<<pa;输出指针变量pa的值,它的值就是a的地址。
             //cout<<&pa;输出变量pa的地址,当然变量a的地址和变量pa地址是不一样的
    cout<<"swap1之前打印地址"<<&a<<"   "<<&b<<endl;
    cout<<"swap1之前打印值"<<a<<"   "<<b<<endl;
    swap1(10,20);    /*发现swap1(a,b)和swap1(10,20)的结果仅仅表现在函数内部,
                      所以当swap1(a,b)的时候,只是把普通是数字1和2赋值进去了,
                      并没有真正把a和b的值传进去,所以a和b的值是不会交换的;
                      swap2和swap3函数中,不能像swap1函数一样直接赋数值进去*/
    cout<<"调用swap1之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
    cout<<"调用swap1之后打印地址"<<&a<<"   "<<&b<<endl;
    //=========================================================================================================
    cout<<"==========================================================================================="<<endl;
    
    
    
    a=1;b=2;
    cout<<"swap2之前打印地址"<<&a<<"   "<<&b<<endl;
    cout<<"swap2之前打印值"<<a<<"   "<<b<<endl;
    swap2(pa,pb);
    cout<<"调用swap2之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
    cout<<"调用swap2之后打印地址"<<&a<<"   "<<&b<<endl;
    //========================================================================================================
    cout<<"==========================================================================================="<<endl;
    
    
    
    a=1;b=2;
    cout<<"swap3之前打印地址"<<&a<<"   "<<&b<<endl;
    cout<<"swap3之前打印值"<<a<<"   "<<b<<endl;
    swap3(a,b);
    cout<<"调用swap3之后打印值:"<<"a="<<a<<"\t"<<"b="<<b<<endl;
    cout<<"调用swap3之后打印地址"<<&a<<"   "<<&b<<endl;
}




void swap1(int x,int y){    //调用swap1(a,b)时候,里面的a和b并没有指定是a的值和b的值,只代表单纯的数字而已。
    int tmp=x;                //打比方,A同学拿着苹果,B同学拿着香蕉,程序并没有从A,B两个同学手里把两种水果交换,
    x=y;                    //而是自己另外买了苹果和香蕉,然后把两种水果交换了。结果A同学还是拿着苹果,B同学还是拿着香蕉,所以没有交换
    y=tmp;                    //也可以理解为swap1函数仅仅对函数内部起作用
    cout<<"swap1函数内部打印x,y的值:"<<x<<"\t"<<y<<endl;
}
void swap2(int *px,int *py){    //使用swap2(pa,pb)传进变量a和b的地址
    int tmp;
    tmp=*px;                    //pa和pb的值,也就是a和b的地址信息,传进去以后,仅仅对a和b的值进行交换;
    *px=*py;                    //为什么用指针才能交换?直接交换就不行?有指针才能告诉a和b地址在哪里呀,知道他们两在哪里才能交换他们的数值
    *py=tmp;                    //仅仅找个数字1和2,却不知道a和b在哪里,肯定交换不了a和b的值
    cout<<"swap2函数内部打印x,y的值:"<<*px<<"\t"<<*py<<endl;
}
void swap3(int &x,int &y){    //引用了变量a和变量b,a代替了x,b代替了y,可以理解为,
    int tmp=x;                //程序已经知道A同学拿苹果B同学拿香蕉了,那当然就可以有效地交换水果了
    x=y;
    y=tmp;
    cout<<"swap3函数内部打印x,y的值:"<<x<<"\t"<<y<<endl;
}

运行效果:

指针详解图:

猜你喜欢

转载自blog.csdn.net/Xeon_CC/article/details/108686878