1,首先我们通过一个例子来说一下指针最基本的定义以及用法:#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int *p = &a;
*p = 100;//a = 100;
p = &b;
*p = 200;//b = 200;
int **pp = &p;
*pp = &a;//p = &a;
**pp = 1000;//a = 1000;
*pp = &b;//p = &b;
**pp = 2000;//b = 2000;
return 0;
}
通常情况下,"*"有三层意思(后面还会遇到不同的使用)定义指针;间接访问符(解引用);乘法;&a,取得a的地址,&是取地址符.
int *p = &a;所以,这一句的意思也就是,定义整形指针变量存放整型地址(指针)。其实,"指针==地址".
一般情况下,指针占四个字节,当然这取决于操作平台。在X86或者32位平台指针4字节,在X64或者64位平台指针8字节
2,接下来我们说一下子函数和父函数之间的调用关系:
程序一:
#include <stdio.h>
void swap_error1(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=20;
printf("%d,%d\n",a,b);
swap_error1(a,b);
printf("%d,%d\n",a,b);//10,20
return 0;
}
程序二:
#include <stdio.h>
void swap_error2(int *p1,int *p2)//error.未使用解引用
{
int *tmp;
tmp=p1;
p1=p2;
p2=tmp;
}
int main()
{
int a=10;
int b=20;
printf("%d,%d\n",a,b);
swap_error2(&a,&b);//10,20
printf("%d,%d\n",a,b);
return 0;
}
分析:以上两个程序为什么最终都没有实现交换呢?
由上图我们可以看出:程序一,其实我们只是实现了子函数里的交换,并没有修改父函数中的值。因此,为了实现父函数值得交换,我们可以借用指针。那么就有了程序二的函数设计:定义三个指针变量,int *p1;int *p2;int *tmp;但是发现同样也没有实现值得交换。这又是为什么?
程序三:
#include <stdio.h>
void swap(int *p1,int *p2)//ok."传指针","解引用"缺一不可。
{
int tmp=*p1;
*p1=*p2;
*p2=tmp;
}
int main()
{
int a=10;
int b=20;
printf("%d,%d\n",a,b);
swap(&a,&b);
printf("%d,%d\n",a,b);//20,10
return 0;
}
分析:程序三实现了函数值的交换,所以可以得出:子函数能修改父函数中的内容的前提是:"传指针,解引用".两者缺一不可。