开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情。
一、如何定义数组的指针
-
先定义出数组的类型,再通过类型创建数组指针
typedef int(ARRAY_TYPE)[5]; -
先定义数组指针的类型,再创建数组指针变量
typedef int(*ARRAY_TYPE)[5]; -
直接创建数组指针变量
int(*pArr)[5] = &arr;
二、二维数组名称
-
除了两种特殊情况外,都是指向第一个一维数组的指针
-
两种特殊情况
-
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];
三、指针数组的排序
- 选择排序
- 假设排序规则为从小到大
- 先认定一个最小值下标为i,通过j = i+1找的真实最小值下标
- 判断计算出的真实最小值下标 和开始认定的i是否相等,如果
- 不相等,交换i和min下标的两个元素
- 对指针数据进行从大到小排序
四、结构体基本使用
-
如果有
typedef定义结构体,那么后面跟着的单词是类型的别名 -
没有
typedef,定义结构体,后面跟着的单词是一个结构体变量 -
结构体数组
-
在栈上开辟
-
在堆区开辟
-
五、结构体赋值问题以及解决
-
系统提供的赋值操作是简单的值拷贝,逐字节拷贝---- 浅拷贝
-
如果属性中有指向堆区的内容,在释放期间会导致堆区重复释放,并且还有内存泄露
-
解决方案:利用深拷贝,手动赋值
六、结构体嵌套一级指针
-
设计结构体
struct Person { char * name,int age } -
在堆区创建 结构体指针数组
malloc(sizeof(struct Person *) * 3); -
给每个结构体也分配到堆区
-
给每个结构体的姓名分配到堆区
-
打印数组中所有人的信息
-
释放堆区数据