C语言指针的学习
本文为学习麦子学院提供的教程所做的笔记。可在b站搜Linux嵌入式ARM开发教程第一阶段
,第41节。
C语言的操作方式
- CPU通过地址总线找到内存中的内容
寻找(寻址)
- CPU要使用资源需要先通过门牌号找到一个资源,即为寻找(寻址)过程
地址
- C语言中没有Address,而是pointer,使用pointer来描述地址的概念
指针
- 指针可以理解为内存资源的地址或者门牌号、标识
内存资源
- 内存资源即内存类型的资源,包含有内存条、显卡、IIC、USB等设备
- 内存资源的地址存储在指针中
指针变量
- 变量:在内存中圈一块地,在地上存东西
int a;
a即一块int大小的地。
- 指针变量:存放指针这个概念的盒子(地)
指针的声明
在声明指针变量时,C语言编译器对存放指针的盒子这一特殊空间存在两种疑问:
1.分配给指针的盒子要多大?
2.盒子里存放的地址所指向的内存的读取方法是什么?
打个比喻:CPU要提取内存条中的资源:
假设内存条里面有很多门牌/ID号,需要将这些门牌号存入CPU中
- 设CPU为8bit,则最大可以存入256个不同的门牌号,即装门牌号的盒子最多仅有256的容量
- 设CPU为32bit,则最大可以存入2^32个不同的门牌号,即大小为4G
因此可以回答前面的问题:
- CPU的位数即为盒子的大小
- 内存的读取方法即为:指针变量前声明的数据类型
比如一个8位的cpu:
char *p;//*p代表一个2^8大小的门牌号,每次从盒子里面读取的数据大小为char(1B)
int *p; //*p代表一个2^8大小的门牌号,每次从盒子里面读取的数据大小为int(4B)
一个32位的cpu:
char *p;//*p代表一个2^32大小的门牌号,每次从盒子里面读取的数据大小为char(1B)
int *p; //*p代表一个2^32大小的门牌号,每次从盒子里面读取的数据大小为int(4B)
总结
- 对于所有的指针变量来说,其大小跟CPU直接挂钩
- 指针变量的声明,如char、int等代表的是从指针地址中读取的数据的变量类型,而不是定义的指针的大小