在C语言中,函数的参数应该用逗号分隔,并且在括号内。对于你给出的例子 fun((((1,2),3),4));
,这实际上是一个利用了逗号运算符的表达式。
逗号运算符 ,
会按照从左到右的顺序计算其操作数,并返回最后一个操作数的值。所以 (((1,2),3),4)
这个表达式的结果将是4。
因此,你这个函数调用 fun((((1,2),3),4));
的参数就是整数4。
函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在32位单片机中,任何类型的指针变量都存放的是一个大小为4字节的地址。
int a; < = > void cal_sum(void);
int * p; < = > void (*func_ptr)(void);
p=&a; < = > func_ptr= &cal_sum;
左边走义变量a
,右边定义函数cal_sum
;
左边定义int
指针,右边定义func_ptr
;
左边赋值指针
,右边赋值函数指针
;
可能这样大家还是不太清楚,我是搞嵌入式单片机的,有本事你在Keil中给我举一个例子啊?
可以啊,没问题,请看!
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
uint8_t cal_sum(uint8_t a, uint8_t b)
{
return a + b;
}
int main(void)
{
delay_init();
uart_init(9600);
printf("www.zhiguoxin.cn\r\n");
printf("微信公众号:果果小师弟\r\n");
uint8_t a = 10;
uint8_t b = 8;
/*定义一个函数指针*/
uint8_t (*func_ptr)(uint8_t, uint8_t);
/*将函数名赋值给函数指针*/
func_ptr = cal_sum;
printf("cal_sum_address =0x%p\r\n", cal_sum);
printf("func_ptr_address =0x%p\r\n", func_ptr);
printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
printf("%d + %d = %d\r\n", a, b, func_ptr(a, b));
while(1)
{
}
}
这样写大家应该很熟悉吧,我首先定义了一个函数指针func_ptr,接着将我写得cal_sum函数赋值给了函数指针func_ptr 。然后分别打印函数cal_sum的地址,函数指针func_ptr的地址,以及使用cal_sum计算出来的值,和函数值指针func_ptr计算出来的值。
那么结果是啥样呢?
可以发现函数指针func_ptr
和cal_sum
函数的存储的地址以及他们所计算出来的值是一样的。
比如在上面求两个数和的基础上再求两个数的乘积和差,会是啥样的呢?
代码是这样的
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
uint8_t cal_sum(uint8_t a, uint8_t b)
{
return a + b;
}
uint8_t cal_sub(uint8_t a, uint8_t b)
{
return a - b;
}
uint8_t cal_mul(uint8_t a, uint8_t b)
{
return a * b;
}
int main(void)
{
delay_init();
uart_init(9600);
printf("www.zhiguoxin.cn\r\n");
printf("微信公众号:果果小师弟\r\n");
uint8_t a = 10;
uint8_t b = 8;
/*定义一个函数指针*/
uint8_t (*func_ptr)(uint8_t, uint8_t);
/*将函数名赋值给函数指针*/
func_ptr = cal_sum;
printf("cal_sum_address =0x%p\r\n", cal_sum);
printf("func_ptr_address =0x%p\r\n", func_ptr);
printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
printf("%d + %d = %d\r\n\n", a, b, func_ptr(a, b));
/*将函数名赋值给函数指针*/
func_ptr = cal_sub;
printf("cal_sub_address =0x%p\r\n", cal_sub);
printf("func_ptr_address =0x%p\r\n", func_ptr);
printf("%d - %d = %d\r\n", a, b, cal_sub(a, b));
printf("%d - %d = %d\r\n\n", a, b, func_ptr(a, b));
/*将函数名赋值给函数指针*/
func_ptr = cal_mul;
printf("cal_mul_address =0x%p\r\n", cal_mul);
printf("func_ptr_address =0x%p\r\n", func_ptr);
printf("%d * %d = %d\r\n", a, b, cal_mul(a, b));
printf("%d * %d = %d\r\n", a, b, func_ptr(a, b));
while(1)
{
}
}
截个图看的更清楚一点
串口打印结果:
指向函数的指针被称作是函数指针。通过函数指针,我们可以灵活的调用各种形式相同,但是功能不同的函数这样做大大的增加了代码的灵活程度。
在C语言中函数的参数为传递给函数的外部数据,可以是变量、常量或表达式。函数参数的数量可以是0个、1个、多个。在函数声明和函数定义中,需要指定每个参数的类型。
下面举例说明:
void print_hello(void)
{
printf("Hello!");
}
int main()
{
print_hello(); //调用函数
return 0;
}
int square(int num)
{
return num * num;
}
int main()
{
int x = 5;
int result = square(x); //调用函数并接收返回值
printf("%d的平方是%d", x, result);
return 0;
}
int add(int a, int b)
{
return a + b;
}
int main()
{
int x = 5, y = 3;
int result = add(x, y); //调用函数并接收返回值
printf("%d加%d等于%d", x, y, result);
return 0;
}