1.一维数组名称
- 本身并不是一个指针 
- 有两种特殊的情况 - 对数组名进行sizeof
- 对数组名称取地址,过去的指针步长是整个数组的长度
 
- 除了两种特殊情况外,都是指向数组中首元素的地址的指针 
- 数组名—指针常量,指针的指向不可以修改 
- 如果将数组名传入到函数参数中,可以提高可读性,通常写:int arr [ ] 
- 访问数组元素的时候,下表也可以是负数 
2.如何定义数组的指针
- 先定义出数组的类型,在通过类型创建数组指针- typedef int(ARRAY_TYPE)[4];
 
- 先定义出数组指针的类型,再创建数组指针变量- typedef int(*ARRAY_TYPE)[4];
 
- 直接创建数组指针变量- int (*pARR)[5] = &arr;
 
3.二维数组名称
- 除了两种情况以外,都是指向第一个一维数组的指针 
- 两种特殊的情况 - sizeof统计整个二维数组的长度
- 对数组名称取地址 int(*p2)[3] [3] = &arr;
 
- 二维数组做函数参数传递方式 - void printArray( int p[][3] , int row, int col) 
- void printArray(int p[3][3], int row, int col) 可读性高 
- void printArray( int(*p)[3] , int row ,int col) 
 
- 数组指针,指针数组的区别 - 数组指针: 是一个指向数组的指针 ,int (*p)[10];
- 指针数组:是一个存放指针的数组, int *p[10];
 
4.指针数组的排序
- 选择排序 - 假设排序的规则从小到大
- 先认定一个最小的小标为i,通过j= i + 1循环来找到真实最小值的下标
- 判断认定的下标和真实的下标是否相等,如果不相等就交换两个元素
 
- 练习:对指针数据进行从大到小排序 
5.结构体的使用
- 如果有使用typedef定义结构体,那么后面跟着的单词是类型的别名
- 没有使用typedef,定义结构体,后面跟着的单词是一个结构体变量
- 结构体数组- 在栈上开辟
- 在堆区开辟
 
6.结构体赋值问题
- 系统提供的赋值操作是简单的值拷贝,逐字节拷贝-浅拷贝
- 如果属性中有指向堆区的内同,在释放期间会导致堆区重复释放,并且还有内存泄漏
- 解决方案:利用深拷贝:手动赋值
 
        