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; }
分析:程序三实现了函数值的交换,所以可以得出:子函数能修改父函数中的内容的前提是:"传指针,解引用".两者缺一不可。
如何正确使用指针?子函数能影响父函数的前提又是什么呢?
最新推荐文章于 2021-09-04 10:42:28 发布