- day5
- 一、指针函数
- 1.概念
- 本质是函数,函数的返回值是指针。
- 2.定义格式
- 数据类型 *函数名(参数列表) { 函数体; return 地址; //当失败时一般返回NULL }
- 3.函数内开辟堆区空间
- 案例一:
-

- 结果未知,因为返回局部变量地址,函数调用结束后没有权限使用栈区的空间了所以结果是不可控的。如果被其他进程占用,可能会报段错误或者打印奇怪的东西。
- 修改:可以返回堆区空间的地址
-
-
- 案例二:
-

- 报段错误:因为q指向NULL, 函数内改变形参p的指向不会影响到q,函数调用结束q还是指向NULL。
- 修改:传递二级指针
-
-
- 案例三: 数组传递
-

- 传递数组形式是为了让用户知道要传递的是一个数组,但本质还是传递数组首地址也就是本质是指针。
-
- 案例一:
- 1.概念
- 二、函数指针
- 1.概念
- 本质是指针,指向了函数。
- 2.定义格式
- 数据类型 (*指针名)(参数列表);
- 3.案例
- 3.1函数名: 函数地址
-
- 3.2把函数指针当成参数传递给函数。一种接口, 多种方法。
-
- 3.3结构体内成员是函数指针(不常用但是看内核原码可能会见到)
-
- 3.1函数名: 函数地址
- 1.概念
- 三、函数指针数组
- 1.概念
- 本质是数组,数组中元素是函数指针。
- 2.格式
- 数据类型 (*数组名[元素个数])(形参列表);
- 数据类型: 和数组中函数指针指向的函数的返回值一致
- 形参列表: 和数组中函数指针指向的函数的形参一致
- 3.赋值
- int (*arr[3])(int,int)={函数名列表};
-
- int (*arr[3])(int,int)={函数名列表};
- 4.练习
- (a) 一个整型数 int a;
- (b) 一个指向整型的指针 int *p;
- (c)一个指向指针的指针,它指向的指针是一个指向一个整型 int **p;
- (d)一个有10个整型数的数组 int a[10];
- (e)一个有10个指针的数组,该指针是指向一个整型数的 int *arr[10];
- (f)一个指向有10个整型数数组的指针 int a[10]; int (*p)[10]=&a;//相当于升级,可以把列地址升级成行地址。或者: int arr[1][10]; int (*p)[10]=arr;
- (g)一个指向函数的指针, 该函数有一个整型参数并返回一个整型数 int (*p)(int);
- (h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 int (*p[10])(int);
- 1.概念
- 四、条件编译
- 1.概念
- 按照条件是否满足决定代码是否被编译,是预处理指令。 简单来说就是 后面的条件语句(condition)如果执行结果不为0,则该#if语句块内的代码会被编译,否则就不会被编译。
- 2.根据宏是否定义
- #define 宏名
- #ifdef 宏名 代码块1
- #else 代码块2
- #endif
- 执行顺序: 宏名如果链接定义则编译代码块1,否则编译代码块2。
-
- 3.根据宏值
- #define 宏 值
- #if 宏名 代码块1
- #else 代码块2
- #endif
- 执行顺序:宏的值为非0也就是真则编译代码块1,否则编译代码块2。
-
- 4.防止头文件重复包含
- 放在头文件中:
- #ifndef 宏名
- #define 宏名 头文件中语句
- #endif
- 例子:
-

- 报错是因为结构体stu重复定义,因为包含结构体定义的head.h被多次引用。
- 修改:加上防止头文集重复包含。

-
- 1.概念
- 一、指针函数
C语言高级进阶5
最新推荐文章于 2026-01-08 20:30:12 发布










1299

被折叠的 条评论
为什么被折叠?



