惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
量子位
D
DataBreaches.Net
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
B
Blog
The Cloudflare Blog
D
Docker
I
InfoQ
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
腾讯CDC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
S
SegmentFault 最新的问题
GbyAI
GbyAI
有赞技术团队
有赞技术团队

faryou的博客

faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-福建行小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-夏令营小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客-暑假阶段总结与展望 faryou的博客 faryou的博客 faryou的博客 faryou的博客 台风进行时 faryou的博客 limbo虚拟机初体验&安装Windows NT 4.0 faryou的博客 台风将来时 faryou的博客 faryou的博客 faryou的博客 faryou的博客 出租车上的对话 faryou的博客
【C语言】指针的理解与应用
作者: faryou · 2025-08-31 · via faryou的博客

前言
指针是很多人在学习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,下次见!(好久没写正经的文章了,肝了一个多小时,还是用平板写,心疼下高中生吧~)