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

推荐订阅源

博客园 - 三生石上(FineUI控件)
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
T
Tailwind CSS Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
B
Blog
N
Netflix TechBlog - Medium
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
O
OpenAI News
M
MIT News - Artificial intelligence
D
DataBreaches.Net
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic
Vercel News
Vercel News
T
Tenable Blog
Security Latest
Security Latest
C
Check Point Blog
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
月光博客
月光博客
TaoSecurity Blog
TaoSecurity Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
雷峰网
雷峰网
IT之家
IT之家
H
Hacker News: Front Page
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Last Week in AI
Last Week in AI
G
Google Developers Blog
Forbes - Security
Forbes - Security
The Register - Security
The Register - Security
Cyberwarzone
Cyberwarzone
小众软件
小众软件
Martin Fowler
Martin Fowler
K
Kaspersky official blog
P
Proofpoint News Feed
T
Threatpost
Google Online Security Blog
Google Online Security Blog
Microsoft Azure Blog
Microsoft Azure Blog

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