第 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
*/
标签:字符,arr,函数,int,传递,数组,指针
From: https://www.cnblogs.com/petard/p/18129935