C语言重难点归纳(6)

150 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

一、如何定义数组的指针

  1. 先定义出数组的类型,再通过类型创建数组指针 typedef int(ARRAY_TYPE)[5];

  2. 先定义数组指针的类型,再创建数组指针变量 typedef int(*ARRAY_TYPE)[5];

  3. 直接创建数组指针变量 int(*pArr)[5] = &arr;

二、二维数组名称

  1. 除了两种特殊情况外,都是指向第一个一维数组的指针

  2. 两种特殊情况

  • sizeof 统计整个二维数组长度

  • 对数组名称取地址 int(*p2)[3][3] = &arr;

  1. 二维数组做函数参数传递方式
  • 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)

  1. 数组指针 与 指针数组 区别
  • 数组指针 是一个指向数组的指针 int (*p)[10];

  • 指针数组 是一个存放指针的数组 int * p[10];

三、指针数组的排序

  1. 选择排序
- 假设排序规则为从小到大

- 先认定一个最小值下标为i,通过j = i+1找的真实最小值下标

- 判断计算出的真实最小值下标 和开始认定的i是否相等,如果

- 不相等,交换i和min下标的两个元素
  1. 对指针数据进行从大到小排序

四、结构体基本使用

  1. 如果有typedef 定义结构体,那么后面跟着的单词是类型的别名

  2. 没有typedef,定义结构体,后面跟着的单词是一个结构体变量

  3. 结构体数组

    • 在栈上开辟

    • 在堆区开辟

五、结构体赋值问题以及解决

  1. 系统提供的赋值操作是简单的值拷贝,逐字节拷贝---- 浅拷贝

  2. 如果属性中有指向堆区的内容,在释放期间会导致堆区重复释放,并且还有内存泄露

  3. 解决方案:利用深拷贝,手动赋值

六、结构体嵌套一级指针

  • 设计结构体 struct Person { char * name,int age }

  • 在堆区创建 结构体指针数组 malloc(sizeof(struct Person *) * 3);

  • 给每个结构体也分配到堆区

  • 给每个结构体的姓名分配到堆区

  • 打印数组中所有人的信息

  • 释放堆区数据