一.数组
1. 数组名是一个常量,原因是在申请内存的时候就已经固定了,内存空间一旦固定,数组名就不能修改。
2. 数组首元素的地址和数组地址是两个不同的概念,例如:int a[200]={0}; a代表的是数组首元素的地址,&a代表的是数组地址, a+1跳向数组的下一个元素,步长为4;&a+1的步长是 ( sizeof(int) * 200)。
3. 数组首元素的地址和数组地址相同。
4.数组类型
typedef int (ArrayType)[5];
ArrayType myArray; <====> int myArray[5];
5.指针数组(数组里面存放的是指针)其实数组指针和指针数组看()和[]的优先级,()和[]优先级一样高,但是结合性从左到右,谁写在左边,谁的优先级高。
char *buf[] = {"aaaaa", "fdfsdf", "23432"}; //数组里面存放的指针(指针数组)
6.数组指针(数组指针用于指向一个数组)
typedef int (ArrayType)[5]; //第一种方法
ArrayType myArray;//相当于一级指针
ArrayType *pArray;
pArray = &myArray;//一级指针取地址赋值,pArray 是二级指针
(*pArray)[i] = i;//使用时先还原成一级指针 //指针指向一个数组(数组指针)
typedef int (*pArrayType)[5]; //第二种方法
pArrayType pArray;
int c[5];
pArray = &c;
int (*pMyArray)[5];//直接定义
int c[5];
pMyArray = &c;
7.多维数组本质
多维数组的本质就是数组指针(指向一维数组的指针),步长是往后跳一维的长度。
int a[3][5];
a 和 a+1 相差 ( 5*sizeof(int) )个字节,步长为 ( 5*sizeof(int) )个字节。
(a+i) 代表第i行的地址
*(a+i) 代表第i行首元素的地址
*(a+i) + j 代表第i行第j个元素的地址 <====> &a[i][j]
*(*(a+i) + j)代表第i行第j个元素的值 <====> a[i][j]
推演:a[i] ===> a[0+i] ===> *(a+i)
a[i][j] ===> a[0+i][j] ===> *(a+i)[j] ===> *(a+i)[0+j] ===> *(*(a+i) + j)
a就是指向第i行的地址。
8.多维数组做函数参数退化问题:
char a[30] ====> char *a; char *a[30] ====> char **a; char a[10][30] ====> char (*a)[30];