petard  

第 12 章 指针 pointer

12.3 指针和数组

① 数组名

可以把 数组名 当做是存储了首元素地址的常量。
// arr 的类型表示为 int [5]
int arr[5] = {10,20,30,40,50};

② 指针数组

指针数组(Pointer Array)是一个数组,其中的每个元素都是指针。
int num1=10,num2=20,num3=30;
// ptr_arr 的类型表示为 int *[3]
int *ptr_arr[3] = {&num1, &num2, &num3};

③ 数组指针

数组指针(Array Pointer)是一个指针,它指向一个数组。
数组指针指向的是【整个数组的地址】而不是第一个元素的地址,虽然二者值是相同的,但在运算中会表现出不同。
int arr[5] = {10,20,30,40,50};
// arr_ptr 的类型表示为 int (*)[5]
int (*arr_ptr)[5] = &arr;

④ 字符指针

1. 字符指针用来表示字符串,可以将字符串字面量直接赋值给字符指针,也可以将字符数组名赋值给字符指针。
2. 字符指针可以重新赋值
3. 字符指针如果指向的是【字面量常量】,不能通过字符指针修改里面的字符

总结:

数据类型 sizeof 计算结果 +1 的值 * 取值(解引用) 能否重新赋值(可变性)
数组名 元素类型[] 整个数组的存储长度 下一个元素地址 首元素的值
指向首元素指针 元素类型* 地址的存储长度 下一个元素地址 首元素的值
数组指针 元素类型 (*)[] 地址的存储长度 越界(数组后面) 整个数组

12.4 值传递和引用传递

引用传递:

① 变量赋值过程中

引用传递: 如果等号的右值是【指针、地址、数组名】,称为引用传递

② 函数传参过程中

引用传递: 如果【实参】是【指针、地址、数组名】,称为引用传递

scanf:将 num 的地址传入 scanf 函数(引用传递), scanf 函数内部可以把 num 的值给改掉

12.5 指针和函数

① 指针函数

1. 指针函数是个函数,返回值是【指针或地址】
2. 指针函数的返回值【不要指向局部变量】(函数调用结束局部变量就销毁),可以指向静态局部变量。

② 函数指针

1. 函数名
   函数名特定情况下可以视为【指向函数代码区域指针】
   函数名、*函数名、&函数名  ———三者等价
   函数名的类型: 返回类型 (参数类型,参数类型,参数类型),如 double (int,int)
   
2. 函数指针
   是个指针,指向一个函数
   通过函数指针来调用函数, 函数指针名 和 *函数指针名 等价

③ 回调函数 callback

1. 如果函数的参数要求还是函数,【作为参数的函数】称为回调函数
2. 【接收回调函数的形参】需要是【函数指针】

注释:

一种标准的注释形式,可以直接转换为文档;如下:

/**
 * @brief  (意思:摘要)
 * @param	(意思:参数)
 * @param
 * @param
*/


总结

1. 指针的基本概念
   * &
2. 指针运算
   加减整数、自增自减、同类型指针相减、指针比较大小
3. 指针和数组
   ① 数组名  可以当做存储着首元素地址的常量
   ② 指针数组
   ③ 数组指针
   ④ 字符指针
4. 值传递和引用传递
5. 指针和函数
   ① 指针函数
   ② 函数指针 / 函数名
   ③ 回调函数

posted on 2024-04-11 19:52  岌岌无名  阅读(16)  评论(0编辑  收藏  举报