1- 数据类型的本质:固定大小内存块的别名。
2- 压死初学者的三座大山:a 和 &a 数组数据类型(定义一个1 数组类型; 2数组指针; 3数组类型和数组指针类型的关系)。
代码:
void main(){
int a; //告诉 C 编译器分配4个字节的内存
int b[10];//告诉 C 编译器分配40个字节的内存
printf(" b: %d, b+1: %d, &b: %d, &b+1:%d \n",b, b+1, &b, &b+1);
}
>b: 1244972, b+1:1244976, &b:1244972, &b+1:1245012解析:b+1 和 &b+1 结果不一样,是由于 b 和 &b 所代表的数据类型不一样。
b 代表的是数组首元素的地址;&b 代表的是整个数组的地址。所以 b+1 内存增加4个字节,而 &b+1 内存增加40个字节。
3- void 指针的意义
(1)C 语言规定只有相同类型的指针才可以相互赋值;
(2)void* 指针作为 左值用于“接收”任意类型的指针;
(3)void* 指针作为 右值赋值给其他指针时需要强制类型转换:
int *p1 = NULL;
char *p2 = (char*)malloc(sizeof(char)*20) ;
4- 不存在 void 类型的变量:C 语言没有定义 void 究竟是多大内存的别名。
5- 变量的本质
(1)程序通过变量来申请和命名内存空间 int a=0;
(2)通过变量名访问内存空间。变量的本质:(一段连续)内存空间的别名(是一个门牌号)。
(3)修改变量有几种方法?
a- 直接。
b- 间接。内存有地址编号,拿到地址编号也可以修改内存!牛!
代码:
void main(){
int a;
int b;
char *p;
a=10;//直接赋值
printf("&a: %d\n", &a);
//间接赋值==》直接通过内存,首先输出 a 的地址,得知 a 的地址为1245024
*((int*)1245024) =200;
printf("a: %d\n", a);
//间接赋值==》通过指针
p = 1245024;
*p = 300;
printf("a: %d\n", a);
}
>&a: 1245024
a:200
a:300
6- 数据类型和变量的关系?
> 通过数据类型定义变量。
7- 总结及思考
(1)通过变量往内存读写数据;
(2)不是向变量(而是向变量所代表的内存空间中)读写数据。问:变量跑哪去了?
思考1:变量三要素(名称、大小、作用域),变量的生命周期?
思考2:C++ 编译器是如何管理函数1,函数 2 变量之间的关系的?
====》引出两个重要话题:
内存四区模型
函数调用模型