为什么指针被誉为 C 语言灵魂?( 二 )
那能不能反过来呢?
当然 , 这就引出了大端和小端 。
像上面这种将高位字节放在内存低地址的方式叫做大端
反之 , 将低位字节放在内存低地址的方式就叫做小端:
文章插图
上面只说明了 int 型的变量如何存储在内存 , 而 float、char 等类型实际上也是一样的 , 都需要先转换为补码 。
对于多字节的变量类型 , 还需要按照大端或者小端的格式 , 依次将字节写入到内存单元 。
记住上面这两张图 , 这就是编程语言中所有变量的在内存中的样子 , 不管是 int、char、指针、数组、结构体、对象... 都是这样放在内存的 。
文章插图
指针是什么东西?2.1 变量放在哪?上面我说 , 定义一个变量实际就是向计算机申请了一块内存来存放 。
那如果我们要想知道变量到底放在哪了呢?
可以通过运算符
大概会是像这样的一串数字:0x7ffcad3b8f3c
2.2 指针本质上面说 , 我们可以通过
pa 中存储的就是变量 a 的地址 , 也叫做指向 a 的指针 。
在这里我想谈几个看起来有点无聊的话题:
为什么我们需要指针?直接用变量名不行吗?
当然可以 , 但是变量名是有局限的 。
变量名的本质是什么?
是变量地址的符号化 , 变量是为了让我们编程时更加方便 , 对人友好 , 可计算机可不认识什么变量 a , 它只知道地址和指令 。
所以当你去查看 C 语言编译后的汇编代码 , 就会发现变量名消失了 , 取而代之的是一串串抽象的地址 。
你可以认为 , 编译器会自动维护一个映射 , 将我们程序中的变量名转换为变量所对应的地址 , 然后再对这个地址去进行读写 。
也就是有这样一个映射表存在 , 将变量名自动转化为地址:
1a | 0x7ffcad3b8f3c
2c | 0x7ffcad3b8f2c
3h | 0x7ffcad3b8f4c
4....
可是我还是不知道指针存在的必要性 , 那么问题来了 , 看下面代码:
1int func(...){
2 ...
3};
4
5int main {
6 int a;
7 func(...);
8};
9
假设我有一个需求:
要求在func 函数里要能够修改 main 函数里的变量 a , 这下咋整 , 在 main 函数里可以直接通过变量名去读写 a 所在内存 。
但是在 func 函数里是看不见a 的呀 。
你说可以通过
4
5int main {
6 int a;
7 func(
8};
9
这样在func 里就能获取到 a 的地址 , 进行读写了 。
理论上这是完全没有问题的 , 但是问题在于:
编译器该如何区分一个 int 里你存的到底是 int 类型的值 , 还是另外一个变量的地址(即指针) 。
这如果完全靠我们编程人员去人脑记忆了 , 会引入复杂性 , 并且无法通过编译器检测一些语法错误 。
而通过int * 去定义一个指针变量 , 会非常明确:这就是另外一个 int 型变量的地址 。
编译器也可以通过类型检查来排除一些编译错误 。
这就是指针存在的必要性 。
实际上任何语言都有这个需求 , 只不过很多语言为了安全性 , 给指针戴上了一层枷锁 , 将指针包装成了引用 。
可能大家学习的时候都是自然而然的接受指针这个东西 , 但是还是希望这段啰嗦的解释对你有一定启发 。
同时 , 在这里提点小问题:
既然指针的本质都是变量的内存首地址 , 即一个 int 类型的整数 。
那为什么还要有各种类型呢?
比如 int 指针 , float 指针 , 这个类型影响了指针本身存储的信息吗?
这个类型会在什么时候发挥作用?
2.3 解引用上面的问题 , 就是为了引出指针解引用的 。
pa中存储的是a变量的内存地址 , 那如何通过地址去获取a的值呢?
这个操作就叫做解引用 , 在 C 语言中通过运算符 *就可以拿到一个指针所指地址的内容了 。
比如*pa就能获得a的值 。
我们说指针存储的是变量内存的首地址 , 那编译器怎么知道该从首地址开始取多少个字节呢?
这就是指针类型发挥作用的时候 , 编译器会根据指针的所指元素的类型去判断应该取多少个字节 。
如果是 int 型的指针 , 那么编译器就会产生提取四个字节的指令 , char 则只提取一个字节 , 以此类推 。
下面是指针内存示意图:
文章插图
pa 指针首先是一个变量 , 它本身也占据一块内存 , 这块内存里存放的就是 a 变量的首地址 。
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 制药领域|为什么AI制药这么火,为什么是现在?
- 手机壳里头|为什么要在手机壳里面夹钱?10个有9个不懂,我才知道大有讲究
- 短视频|全球最火APP?抖音爆火背后离不开这几剂“猛药”为什么抖音能够这么火?
- 电商快递|包邮不香吗,为什么还有人加49元让小哥穿西装专车送快递?
- 团队|为什么项目管理非常重要?
- 猫腻|为什么拼多多上商品价格那么便宜还包邮?有什么猫腻?看完明白了
- 刷机|前几年满大街的“刷机”服务去哪里了,为什么大家都不爱刷机了?
- 手机|便宜没好货!为什么二手iPhone很便宜,这些手机都来自哪儿?
- 中国|相对论Vol.48丨一个“歪果仁”,为什么要在海外电商平台直播带中国货