恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
C语言——深度理解指针(1)
首页
资讯中心
/
C语言——深度理解指针(1)
C语言——深度理解指针(1)
发布时间:2026/8/20 22:34:02
耕耘 :C、C、嵌入式技术领域我的个人主页❄️个人专栏《C语言专栏》 《嵌入式专栏》✨**不要等待机会而要创造机会**✨博主简介:✨✨一位热爱生活的阳光大男孩.✨✨前言指针是C语言的灵魂也是初学者通往高级编程的必经之路。本文旨在为你拨开指针的迷雾从内存与地址的本质出发系统讲解指针变量、解引用、类型意义及运算等核心概念。通过清晰的图示与代码示例你将理解指针如何操作内存、为何存在类型差异以及void*、指针运算等进阶用法。掌握指针方能真正驾驭C语言的内存世界。文章目录前言1、内存和地址1.1内存2、指针变量和地址2.1 取地址操作符2.2 指针变量和解引⽤操作符*2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引⽤操作符2.3 指针变量的⼤⼩3. 指针变量类型的意义3.1 指针的解引⽤3.2 指针-整数3.3 void* 指针4. 指针运算4.1 指针- 整数4.2 指针 - 指针4.3 指针的关系运算结语1、内存和地址1.1内存我们把内存划分为⼀个个的内存单元每个内存单元的⼤⼩取1个字节。其中每个内存单元相当于⼀个学⽣宿舍⼀个字节空间⾥⾯能放8个⽐特位就好⽐同学们住的⼋⼈间每个⼈是⼀个⽐特位。每个内存单元也都有⼀个编号这个编号就相当于宿舍房间的⻔牌号有了这个内存单元的编号CPU就可以快速找到⼀个内存空间。⽣活中我们把⻔牌号也叫地址在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫指针。所以我们可以理解为内存单元的编号 地址 指针2、指针变量和地址2.1 取地址操作符字面意思它可以取出变量的地址。#includestdio.hintmain(){inta10;a;//取出a的地址printf(%p\n,a);//其中%p于输出或输入指针的地址值return0;}但是int类型一次性是向内存申请了4个字节的空间来储存a的值a取出的是a所占4个字节中地址较⼩的字节的地址所以003FF858就是字节中地址较⼩的字节的地址。变量在内存中的存储虽然整型变量占⽤4个字节我们只要知道了第⼀个字节地址顺藤摸⽠访问到4个字节的数据也是可⾏的。2.2 指针变量和解引⽤操作符*2.2.1 指针变量那我们通过取地址操作符()拿到的地址是⼀个数值⽐如 0x006FFD70这个数值有时候也是需要存储起来⽅便后期再使⽤的那我们把这样的地址值存放在哪⾥呢答案是指针变量中例如#includestdio.hintmain(){inta10;int*paa;//取出a的地址并存储到指针变量pa中return0;}指针变量也是⼀种变量这种变量就是⽤来存放地址的存放在指针变量中的值都会理解为地址2.2.2 如何拆解指针类型inta10;int*paa;这⾥pa左边写的是 int * 是在说明pa是指针变量⽽前⾯的 int 是在说明pa指向的a是int类型的*char类型也同理charchw;char*pchch;//指针变量是pch2.2.3 解引⽤操作符解引用操作符的作用就是可以通过地址对对这个值进行一系列的操作。#includestdio.hintmain(){inta100;int*paa;*pa0;printf(%d\n,a);return0;}**pa 的意思就是通过pa中存放的地址找到指向的空间pa其实就是a变量了所以pa 0这个操作符是把a改成了0.*2.3 指针变量的⼤⼩32位平台下地址是32个bit位指针变量⼤⼩是4个字节64位平台下地址是64个bit位指针变量⼤⼩是8个字节注意指针变量的⼤⼩和类型是⽆关的只要指针类型的变量在相同的平台下⼤⼩都是相同的。3. 指针变量类型的意义3.1 指针的解引⽤1、#includestdio.hintmain(){intn0x11223344;int*pin;*pi0;return02、#includestdio.hintmain(){intn0x11223344;char*pc(char*)n;//char*含义为将n强制转换为char型*pc0;return0调试我们可以看到代码1会将n的4个字节全部改为0但是代码2只是将n的第⼀个字节改为0。结论指针的类型决定了对指针解引⽤的时候有多⼤的权限⼀次能操作⼏个字节。⽐如 char的指针解引⽤就只能访问⼀个字节⽽ int的指针的解引⽤就能访问四个字节。**3.2 指针±整数intmain(){intn10;char*pc(char*)n;//将*n改成成char*类型int*pin;printf(%p\n,n);printf(%p\n,pc);printf(%p\n,pc1);//指针1表示跳过类型char*的数据也就是1个字节printf(%p\n,pi);printf(%p\n,pi1);//指针1表示跳过类型int*的数据也就是4个字节return0;}我们可以看出 char* 类型的指针变量1跳过1个字节 int* 类型的指针变量1跳过了4个字节。结论指针的类型决定了指针向前或者向后⾛⼀步有多⼤距离。3.3 void* 指针可以理解为⽆具体类型的指针或者叫泛型指针这种类型的指针可以⽤来接受任意类型地址inta10;int*paa;//正确的char*pca;//这样是错误的因为类型不兼容void*pda;//正确的注意void类型的指针不能直接进⾏指针的±整数和解引⽤的运算*。4. 指针运算4.1 指针± 整数因为数组在内存中是连续存放的只要知道第⼀个元素的地址顺藤摸⽠就能找到后⾯的所有元素#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};int*parr[0];inti0;intszsizeof(arr)/sizeof(arr[0]);for(i0;isz;i){printf(%d ,*(pi));//pi 这⾥就是指针整数//注意指针—指针的时候两个指针要指向同一块地方}return0;}4.2 指针 - 指针得到指针和指针之间的元素个数intmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};printf(%d,arr[9]-arr[0]);//得到指针和指针之间的元素个数//注意指针相减表示其中间有几个指针类型return0;}4.3 指针的关系运算#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};int*parr[0];intszsizeof(arr)/sizeof(arr[0]);while(parrsz)//指针的⼤⼩⽐较{printf(%d ,*p);p;}return0;}结语“别走你的三连还在我这儿寄存着呢点赞是门票投币是VIP收藏是复活甲下次更新记得来取哦完.