「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
参数与指针
-
形参与实参
- 形参:形式参数(只有在函数内部有效,调用之前不分配内存,调用结束回收内存)
- 实参:实际划分内存
- 实参可以传值给形参,但形参不能传值给实参
-
传值和传址
-
不使用指针交换两个变量的值(传值)
- 代码
- 结果
- 代码
-
使用指针交换两个变量的值(传址)
- 代码
- 结果
- 代码
-
-
传数组
- 举例
- 结果
-
注意
- 在64位操作系统中,指针占8个字节
- 举例
-
可变参数
-
要引用库#include<stdarg.h>
- va_list:定义参数列表
- va_start:宏定义
- va_arg:获取参数
- va_end:关闭参数列表
- 举例
- 结果
-
-
指针函数
- 举例
- 结果
- 注意:想要调用函数返回字符串,但是C语言没有字符串类型,所以通常使用char类型的指针来定义字符串。(因为char类型的指针指向一个字符的地址,使用该类型指向字符串的第一个字符地址,字符串约定截止为空字符‘\0’,所以知道第一个字符就知道了整个字符串,这是由字符串的性质决定的。)
-
不要返回局部变量的指针
- 举例
- 结果:无法返回结果(因为返回的是局部变量,但是返回之后该地址自动销毁,故无法返回局部变量的指针)
- 举例
- 为什么可以直接返回字符串常量:因为字符串是常量,存储区域不是局部\
- 举例
指针函数和函数指针
-
函数指针
- 指针函数:int *p();
- 函数指针:int (*p)();
- 举例
- 结果
- 注意:理解为函数名=数组名=首地址,这里将fp赋值为square的地址,*fp则代表这个函数。类似于数组
-
函数指针作为参数
- 举例
- 结果
- 注意:第一个参数是指针,这个指针指向一个函数,且该函数需要符合的条件:有两个参数且都为整形,返回值也为整形
- 举例
-
函数指针作为返回值
- 比如这个函数的名字叫select,它本身有两个参数,返回返回值是一个函数指针,这函数指针也有两个参数,并且其返回值为整型。
- 现在让用户输入一个表达式,然后程序根据用户输入的运算符来决定调用add还是sub函数进行运算。
- 代码
- 结果(加法和减法各执行一次)
-
注意:
- int (select(char))(int,int);//运算符有优先级,首先运算的是参数为char且返回值为指针的指针函数select(char),其次可以看成参数为两个int且返回值为int的函数指针int (*)(int,int);
- int (select(char op))(int num1,int num2){}//该函数可以直接看成select指针函数,返回值为满足int ()(int,int);的函数指针