【C语言】指针的理解与应用
前言
指针是很多人在学习C语言路上所遇到的一个极难的障碍,有许多人都因为无法理解指针而放弃了学习C语言。我个人一开始也是完全无法理解指针,在刻苦钻研半年后,我终于完全理解了指针这一语法难点。下面我就指针的理解与应用进行详细的讲解~~
指针是什么
很多初学者可能无法理解这些问题:指针是什么?为什么要用指针?用指针有什么好外?为什么scanf里的参数要用指针,而printf却要用变量名?
首先,指针本身是个变量,存储内容是一个地址,这一点已经令人很难理解了。我们需要明白,所谓“内存条”物理上真的就是一条,各种数据占据了不同的位数。因此,我们可以给每个内存都标一个地址,这样计算机就能更好地访问数据(别问我为什么,可以自己想一下,如果全世界都没有门牌号,你访问某人的家会不会更麻烦)。地址(指针)是十六进制数,标号顺序相当于从0号开始不断增加,说的明白些,地址就是从内存条第一格开始数,到当前格是几格。
如果你有了一个变量的指针,那么你就可以用指针来访问这个地址来改变其值,那这样来说,我们是否可以直接用地址来访问并更改某个变量呢?答案是肯定的。下面是一个例子:
#include <stdio.h> main(){ int a=0; int *p=&a;/*定义指针变量p,并赋值为a的地址*/ *p=1; printf("%d",a);/*输出结果应为1*/ return 0; }
在C语言中,用*指针变量名的形式表示指针变量指向地址的值。
这样我们就可以解释为什么printf的参数是变量的值,而scanf的参数是指针了:printf输出变量时只需要变量的值,与变量的地址无关;而scanf则要改变变量的值,只有变量的值并不能改变它,必须得到它的地址。
用指针写个函数
指针的用处非常大,下面我们用指针写个简单的小程序:交换变量值的函数。
/*不批注了,自己看吧*/ #include <stdio.h> void swap(int *a,int *b){ int t; t=*a; *a=*b; *b=t; return ; } main(){ int x,y; scanf("x=%d,y=%d",&x,&y); swap(&x,&y); printf("x=%d,y=%d",x,y); return 0; }
但是如果把程序写成下面这样:
#include <stdio.h> void swap(int a,int b){ int t; t=a; a=b; b=t; return ; } main(){ int x,y; scanf("x=%d,y=%d",&x,&y); swap(a,b); printf("x=%d,y=%d",x,y); return 0; }
那么x和y的值最后不会被交换,因为swap函数里的代码只是交换了参数a,b的值,作用域在函数内,对main函数里的变量没有任何影响。
指针进阶版——函数指针
指针可以指向变量,那么也可以指向函数,下面是一个示例:
/*使用指针变量及可变参数,写一个任意参数数量的比较程序*/ #include <stdio.h> #include <stdarg.h> int compare(int (*cmp)(int,int),int num,...){ va_list valist; va_start(valist,num); int ans=va_arg(valist,int),i=0; while(++i<=num) ans=cmp(ans,va_arg(va_list,int)); return ans; } /*下面定义了两个常用cmp函数(取大值和取小值)*/ int MAX_CMP(int a,int b){ if(a>=b) return a; else return b; } int MIN_CMP(int a,int b){ if(a<=b) return a; else return b; } /*也可以自定义需要的cmp函数*/ main(){ int t,a,b,c,d; scanf("%d%d%d%d%d",&t,&a,&b,&c,&d); switch(t){/*用户选择取最大、最小值*/ case 1: printf("%d",compare(MAX_CMP,4,a,b,c,d); break; case 2: printf("%d",compare(MIN_CMP,4,a,b,c,d); break; } return 0; }
(这个compare函数可以自己开个文档存着,需要时拿出来微调一下即可~)
结语
本文介绍了C语言中对指针的使用,用简单的程序帮助学习者了解指针的用法。我是faryou,下次见!(好久没写正经的文章了,肝了一个多小时,还是用平板写,心疼下高中生吧~)
本文链接:https://blog.faryou.eu.org/post/116.html 转载需经作者授权!