-
int a=10; 的含义
地址总线&数据总线
1.在内存中选择了一个区域,命名为a,空间维护4B
2.CPU首先选择到内存的特定区域,告诉了内存激活这个区域
3.CPU想数据总线发出10的数据
4.CPU再发出一个写信号
5.内存通过数据总线,把10写入第二步激活的区域
**所谓的声明其实就是告诉C语言内部做了一张映射表 *eg1. a—0x14
-
指针 => 内存地址
内存地址:值(数字->必须发送到地址线) , 操作方式(一次操作多少B)
靠类型决定地址怎么操作 ```
eg2. 映射表
int a=10 a --- int int * p p --- 地址 sizeof 多大?
每个单位的大小 p + 1(单位)--- 单位大小* 个数
int a1[ 10 ] a1 ------数组名(连续空间的首地址)
个数
每个元素怎么操作
数组名;常量
sizeof(p)=8B
sizeof(a1)= 10 * sizeof(int)
void fun (int a2[10]){ // a2 形参 接收 的是一个地址
a2 是一个数组的标签 相当于一个盒子,盒子的大小是8B/4B
sizeof(a2)=8B // 64bit系统
}
int main(){
int b1[10]; //真正的申请空间
// 传递
fun(b1);
}
变量名的本质
○ 对⼀段内存空间,⽅便程序员描述,让编译器可以进⾏正确映射关系的名称
○ 编译器帮程序员,将这段空间访问的代码,翻译成正确的CPU指令
○ 变量名的注意事项:
■ 编译器能够正确识别 => 有效标识符
■ 不能有重复的变量名 => ⼀个变量名代表⼀个专属空间
■ 变量名必须有类型 => 这样空间才有约束
■ 变量名有作⽤域 => 申请空间和释放空间
指针的本质
○ 保存地址的容器,C语⾔的地址和计算机的地址,在定义时发⽣了改变
○ C语⾔地址如何映射到计算机底层的地址:
- C语⾔地址定义
- C语⾔只定义了地址的形态,具体怎么⽤,全部交由程序员来处理
- 不管越界访问
- 不管有没有权限访问
○ C语⾔定义地址的访问:
* , []
○多维指针的逻辑模型
int **p;
char buf[3][4][5]; //三个面,每个面四行五列
char(*p2)[4][5];
int a[2][3];
int b[2][3];
int c[2][3];
int (*key)[3]
key = init_kry(); // key = c;
int sum =0;
for(int i =0; i<2; i++){
for(int j=0 ; j<3 ; j++){
sum += key[i][j]
}
} //直接让用户输入地址然后呈现,避免直接改代码
操作方式 a a+1 3个int 12B
key 是地址 :大小
操作 key key+1
int **key ; key ------地址
大小
操作? -->一个一个地址的操作
操作:一个int一个int的操作
key key+1 偏移的是一个地址大小