指针概念梳理

梳理一下指针的知识要点,帮助他人理解指针的相关概念,希望能帮到你。
小明接到一个任务:在A篮里有m个苹果,在B篮里有n个苹果,现在需要把A和B篮里的苹果交换,试问交换后两篮里苹果的个数。请用编程代码予以实现。
小明很快完成了程序的编写:
#include
using namespace std;
int main()
{
int m,n,temp;
cin>>m>>n;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
temp=m;//交换两个数据
m=n;
n=temp;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
return 0;
}
这个时候,小明突然想到可以把交换两个数据的代码编写成一个函数。这样,以后有多组AB篮子时候,可以很方便的交换这两个数据:
#include
using namespace std;
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int m,n,temp;
cin>>m>>n;
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
swap(a,b);
cout<<”A apple number”<<m<<endl;
cout<<”B apple number“<<n<<endl;
return 0;
}
然而,令小明吃惊的是,两次输出的值是一样的,也就是说,函数并没有起到预想中作用。
小明百思不得其解。于是他翻阅了资料,发现:函数在执行时会开辟新的存储空间,在实际参数与形式参数相结合后,函数利用新的存储空间对数据进行函数体内语句所要求的处理,并返回数值。小明发现,自己的swap函数的返回值类型是void类型,也就是说函数并没有返回值。执行函数体时函数在新的存储空间里进行的数据的交换仅仅是针对形式参数的交换,对我们真正想要处理的数据并没有进行处理。(就像A在武汉,B在上海,A的替身a在长沙,B的替身b在苏州,我们本来是想要AB交换地理位置,可是我们所编写的函数,仅仅让他们的替身交换了位置,并没有对他们本人造成影响。)小明想:那函数能直接访问我存储数据真身的存储空间就好了。他再次查阅资料发现了一个叫指针变量的东西,能存储变量的地址,于是他利用手上的资料,对程序进行了修改。
#include
using namespace std;
void swapnum(int *pa,int *pb)
{
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
}
















































int main()
{
int m,n;
int *pm=&m,*pn=&n;
cin>>m>>n;
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
swapnum(pm,pn);
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
return 0;
}
我们也来看看小明找到的资料是什么
存放变量的地址需要一种特殊类型的变量,这种数据类型就是指针,具有指针类型的变量被称为指针变量,他是专门用于存放变量地址值的变量。
指针变量的定义:类型关键字 *指针变量名;
类型关键字指明了指针变量所指向的数据类型。
如 int *pa;意为pa是一个指针变量,且指向的数据类型为整形变量。
int *pa,*pb;可以定义两个指向相同数据类型的变量。
指针变量的初始化:
pa=&a;读为指针变量pa指向a变量的地址,可理解为取a变量的地址赋给a变量。
也可在定义的同时进行初始化:int pa = &a;
间接寻址运算符
:通过这个运算符,我们可以很轻松的访问它所修饰的指针变量指向地址存储的数据。所以,pa你可以把它当作一个变量来看待。
此时我们来分辨两种




















  1.     int *pa=&a;
    
  2.     int *pa;
       pa=&a;
    
  3.     int *pa=&a;
       a=1;
       cout<<*pa;
    

1中的是指针变量的定义及初始化中的,它不是一个运算符。
2中的*同1;
3中上面的第一条语句是定义,而下面的cout语句是间接寻址运算符。
这就是小明所找到的资料,因此,小明也可以清楚的解释为什么要这样修改程序了:
#include
using namespace std;
void swapnum(int *pa,int *pb)
{
int temp;
temp=*pa;
*pa=*pb;
*pb=temp;
}











int main()
{
int m,n;
int *pm=&m,*pn=&n;//定义两个指针变量分别指向m,n
cin>>m>>n;
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
swapnum(pm,pn);//注1
cout<<“A apple number”<<m<<endl;
cout<<“B apple number”<<n<<endl;
return 0;
}
注一:此时,传入函数的是两个变量存放的地址,也就是说,函数会直接访问你存放mn变量的地址对他们来进行修改。从而避免了之前出错的情况。也就说,函数在内存层面对数据进行了修改。
小明经过艰苦的奋斗终于完成了他的一个小目标!












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章