您现在的位置是:亿华云 > 域名
一文扒开C语言指针神秘的外衣,指针也不过如此嘛
亿华云2025-10-04 00:52:47【域名】6人已围观
简介指针是 C 语言的灵魂,指针可以直接操作内存,指针使C程序更加高效,等等等等。相信 C 语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。所以,本节不会一上来就直接说指针,但是相信
指针是文扒 C 语言的灵魂,指针可以直接操作内存,语言衣指针使C程序更加高效,指针针也等等等等。神秘相信 C 语言初学者学到指针时,不过会看到很多这样描述指针的文扒话,但是语言衣却往往一头雾水。所以,指针针也本节不会一上来就直接说指针,神秘但是不过相信我,看完本节,文扒你一定会觉得 C 语言的语言衣指针也不过如此,没那么神秘。指针针也
上一节介绍了 C 语言中的神秘数据类型,提到不同的不过数据类型的主要区别在于占用的存储空间不同。我们知道,C 程序是运行在计算机的内存中的,因此 C 程序的变量也是存在于内存中的。服务器租用C 标准规定 char 类型占用一个字节的存储空间,对其他整型却没有做规定,现在为了解释的方便,我们假设 int 类型的数据占用内存 4 个字节。
假设我们如下定义了两个变量:
signed char i = 3; int j = 8;那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,请看下图。
方框表示内存空间,内部表示存储的值。我们把内存逐字节编号,方框外部的数字表示方框的编号(这样的内存“编号”即所谓的“内存地址”)。修改变量 i 的值,实际上就是修改地址为 4000 的内存空间里的值。那反过来呢?如果我修改了地址为 4000 的内存空间里的值,i 的值会相应改变吗?答案是亿华云计算肯定的,请继续往下看。
上图中的内存地址“4000”是我为了解释方便随意取的。那么,在实际应用中,变量 i 的地址如何获取呢?C 语言提供了“&”运算符,就是获取变量地址的。请看下面的例子:
#include <stdio.h> int main() { signed char i = 3; int j = 8; long p1 = (long)&i; printf("p1: %ld ", p1); return 0; }我们取出了 i 的地址,把它强制转换为 long 型(关于强制类型转换,可参考上一节),传递给 p1 了。编译执行,发现变量 i 的地址被打印出来了。这说明,C 程序变量的地址也是一个整数。
按照上面的说法,修改 i 的值除了直接对 i 赋值以外,还可以通过修改 p1 地址处的内存空间里的源码下载数值。那,怎样才能“通过修改 p1 地址处的内存空间里的数值”修改 i 的值呢?
上面的代码实例中,我们使用了 long 型变量 p1 存储了 i 的地址。事实上,C 语言有专门的数据类型存储地址,定义方式也很简单,就是:“类型描述符 * ”,例如,可以定义以下变量存储地址:
signed char *p1 = &i; int *p2 = &j;p1 和 p2 就是 C 语言中所谓的指针类型,因为 i 是 signed char 类型的,所以定义了 signed char * 类型的指针存储 i 的地址。j 是 int 类型的,所以定义了 int * 类型的指针存储 j 的地址。另外,C 语言提供了“&”运算符取变量地址,与之对应的,还提供了“ * ”运算符从相应地址内存里取出数值。
好了,了解了 C 语言的指针类型和“ * ”运算符,现在来看看如何“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。请看如下代码:
signed char *p1 = &i; *p1 = 5; printf("i=%d ", i);编译运行,发现程序输出“i=5”,这样我们就实现了“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。
在定义变量时,” * “放在变量符号前,可以定义指针变量。在定义完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。另外,“ * ”还可以表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。
以上的操作,实际上就是 C 语言的指针操作,可以看出它一点也不神秘,接下来几节,我们将继续讨论 C 语言的指针,比如为什么 int 类型的变量 j 的地址要使用 int* p2; 定义,而不能使用 signed char* p2; 定义,使用指针为何能写出紧凑、高效的 C 程序等等。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言,喜欢我的文章就关注一波吧,可以看到***更新和之前的文章哦。
很赞哦!(3114)
相关文章
- 以上的就是为大家介绍的关于域名的详解域名注册:域名注册0
- Kafka 2.8.0发布,与ZooKeeper正式分手!
- 工作六年后,对软件开发的一些新观点
- 熬了三个晚上总结的Python 200个标准库!建议收藏
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 介绍10个常用的Python内置函数,99.99%的人都在用!
- 字节面试官问粉丝,如何实现准时的SetTimeout
- 流程管理还在用OA?采用无代码数字中台魔方网表才是新趋势
- 众所周知,com域名拥有最大的流通市场和流通历史。最好选择com域名,特别是在购买域名时处理域名。其次可以是cn域名、net域名、org域名等主流域名,现在比较流行的王域名和顶级域名,都是值得注册和投资的。
- 五款实用的JavaScript上传库