1、指针和数组
1、a[2]的本质是:a的内存地址就是a[0]的地址,而[]则是偏移符号,a[2]就是基于a的地址便宜2*4(int)个单位
2、a[2] 的本质就是将a与[2]拆开来解释,所以a就必须代表a[0]的地址,方便编译器识别
3、在求sizeof(a)时,显示的结果是20,所以a虽然是一个a[0]指针,但编译器在用sizeof(a)处理的时候还会将它看作一个数组,数组的大小是5*4=20
2、多维数组(重点)
多维数组在内存中的排列与一维数组相同
重点:
1、多维数组的数组名本质上是一个数组指针(指向数组的指针,本质上是一个指针)(区别于指针数组,指针数组本质上是一个数组,数组的内容放的是指针)
2、数组指针的一个作用就是告诉编译器多少个元素为一组,所以数组指针 int (*ptest)[5]{test}; 中[5]也是很重要的部分,不可或缺,告诉编译器它指向数组是5个为一组的
3、数组指针在+1的时候,加的是数组的大小
4、类比一维数组,test[1][2]是在test[1]的基础上加2*int所对应的值
5、int *ptr=(int*)(&a+1);
这句代码一定要深入理解,分清楚普通指针和数组指针的区别,具体可以参照文章:
3、
编译器在求数组大小sizeof(a)时直接用20做了替换