【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 转载需经作者授权!

分享到:

扫描二维码推送至手机访问。

版权声明:本文由faryou的博客发布,如需转载请注明出处。

本文链接:https://blog.faryou.eu.org/post/116.html

标签: C
分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。