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.结构体赋值问题
- 系统提供的赋值操作是简单的值拷贝,逐字节拷贝-浅拷贝
- 如果属性中有指向堆区的内同,在释放期间会导致堆区重复释放,并且还有内存泄漏
- 解决方案:利用深拷贝:手动赋值