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

推荐订阅源

Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
T
Threatpost
K
Kaspersky official blog
Cisco Talos Blog
Cisco Talos Blog
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
T
Tenable Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
Scott Helme
Scott Helme
云风的 BLOG
云风的 BLOG
博客园 - Franky
Webroot Blog
Webroot Blog
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
F
Fortinet All Blogs
PCI Perspectives
PCI Perspectives
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
月光博客
月光博客
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Help Net Security
Help Net Security
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
O
OpenAI News
Martin Fowler
Martin Fowler
W
WeLiveSecurity
C
Cyber Attacks, Cyber Crime and Cyber Security
Project Zero
Project Zero
V
Vulnerabilities – Threatpost
L
LangChain Blog
P
Privacy & Cybersecurity Law Blog
S
Security Affairs
P
Privacy International News Feed
C
Cybersecurity and Infrastructure Security Agency CISA
MyScale Blog
MyScale Blog
NISL@THU
NISL@THU
T
Troy Hunt's Blog
C
Cisco Blogs
IT之家
IT之家

faryou的博客

出租车上的对话 faryou的博客-告别小高一 faryou的博客-中考 · 竞赛 · 生活 · 思考 5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【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,下次见!(好久没写正经的文章了,肝了一个多小时,还是用平板写,心疼下高中生吧~)