通俗讲解C语言的指针应用

指针无处不
许多初学c语言的人都觉得指针挺难。其实生活中处处都有指针,我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。
不信?你看下面的例子。
这是一个生活中的例子:
比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来时,看到这张纸条,你就知道了我借给你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!其实这张纸条就是一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的这本书。
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
下图是 4g 内存中每个字节的编号(以十六进制表示):
我们将内存中字节的编号称为地址(address)或指针(pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4gb,最小的地址为 0,最大的地址为 0xffffffff。
下面的代码演示了如何输出一个地址:
运行结果:
0x28ff3c, 0x28ff10
%#x表示以十六进制形式输出,并附带前缀0x。a 是一个变量,用来存放整数,需要在前面加&来获得它的地址;str 本身就表示字符串的首地址,不需要加&。
一切都是地址
c语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 cpu 使用。
数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
cpu 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 cpu 要执行的代码以及要读写的数据的地址。如果程序不小心出错,或者开发者有意为之,在 cpu 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。
cpu 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
假设变量 a、b、c 在内存中的地址分别是 0x1000、0x2000、0x3000,那么加法运算c = a + b;将会被转换成类似下面的形式:
0x3000 = (0x1000) + (0x2000); ( )表示取值操作,整个表达式的意思是,取出地址 0x1000 和 0x2000 上的值,将它们相加,把相加的结果赋值给地址为 0x3000 的内存。
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。
需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。


GRANDMICRO有容微电子推出新型2.4GHz Zigbee/ISM射频前端芯片GMR2401
Synaptics TDDI赢得两项移动卓越奖
讨论GitHub的问题以及“卖身”后的未来
门磁领域如何选择霍尔开关
采用多方向天线阵列技术实现微带阵列天线的设计
通俗讲解C语言的指针应用
物联网是未来可穿戴设备的催化剂
充电电池的容量测试方法的详细解析
将摄像头与传感器数据进行整合以提高交通安全
IPS液晶屏幕缘何受追捧? 浅谈IPS屏幕发展历史
立柱机器人码垛机在农业中应用
!销售/收购/维修HP5334B频率计HP5334B!小兵/
5G时代云网融合成为行业业务承接的必然选择
当垃圾分类遇到人工智能 “玩中学”令人体验更深
中国大陆品牌手机下修仍无损于紧张的供需结构 仍维持2018年产业供需紧张
耳机党注意!蓝牙耳机不能长时间佩戴,佩戴不正确可能会损伤听力
国产低功耗5.1蓝牙芯片---XY51S03B
移动电源是什么?
快速接头是如何进行气密测试工作的
iPhone7什么时候上市?库克说我也不知道