C语言函数和指针的关系之三(完结)

简介: C语言函数和指针的关系之三(完结)

指针保存函数的地址(函数指针)

1、函数指针的概念: 咱们定义的函数,在运行程序的时候,会将函数的指令加载到内存 的代码段。所以函数也有起始地址。

c 语言规定:函数的名字就是函数的首地址,即函数的入口地址 咱们就可以定义一个指针变量,来存放函数的地址。 这个指针变量就是函数指针变量。

2、函数指针的用处: 函数指针用来保存函数的入口地址。 在项目开发中,我们经常需要编写或者调用带函数指针参数的函数。

比如 Linux 系统中创建多线程的函数,它有个参数就是函数指针,接收线程函数的入口地址,即创建线程 成功后,新的任务执行线程函数。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)

void *thread_fun1(void *arg)
{
}
void * thread_fun2(void *arg)
{
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread_fun1,NULL);
pthread_create(&tid2,NULL,thread_fun2,NULL);
。。。。
}

3、函数指针变量的定义

返回值类型(*函数指针变量名)(形参列表);

int(*p)(int,int);//定义了一个函数指针变量 p,p 指向的函数 必须有一个整型的返回值,有两个整型参数。
int max(int x,int y) { }
int min(int x,int y) { }

可以用这个 p 存放这类函数的地址。

p=max;
p=min;

4、调用函数的方法

1.通过函数的名字去调函数(最常用的)

int max(int x,int y) { }
int main() {
int num;
num=max(3,5); }

2.可以通过函数指针变量去调用

int max(int x,int y) { }
int main() {
int num;
int (*p)(int ,int);
p=max;
num=(*p)(3,5); }

5、函数指针数组

概念:由若干个相同类型的函数指针变量构成的集合,在内存中连续的顺序存储。 函数指针数组是个数组,它的每个元素都是一个函数指针变量。

函数指针数组的定义:

类型名(*数组名[元素个数])(形参列表)

int(*p[5])(int,int); 定义了一个函数指针数组,数组名是 p,有 5 个元素 p[0] ~p[4],每个元素都是函数指针变量, 每个函数指针变量指向的函数,必须有整型的返回值,两个整型参数。

例:

#include<stdio.h>
int max(int x, int y)
{
int temp;
if (x > y)
temp = x;
else
temp = y;
return temp;
}
int min(int x, int y)
{
int temp;
if (x < y)
temp = x;
else
temp = y;
return temp;
}
int add(int x, int y)
{
return x + y;
}
int 
{
return x - y;
}
int mux(int x, int y)
{
return x * y;
}
int main()
{
int(*p[5])(int, int) = {mux,min,add,sub,mux};
int num;
num = (*p[2])(10,20);
printf("num=%d\n", num);
return 0;
}

6、函数指针应用举例

给函数传参

#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}
int mux(int x,int y)
{
return x*y;
}
int dive(int x,int y)
{
return x/y;
}
int process(int (*p)(int ,int),int a,int b)
{
int ret;
ret = (*p)(a,b);
return ret;
}
int main()
{
int num;
num = process(add,2,3);
printf("num =%d\n",num);
num = process(sub,2,3);
printf("num =%d\n",num);
num = process(mux,2,3);
printf("num =%d\n",num);
num = process(dive,2,3);
printf("num =%d\n",num);
return 0;
}


相关文章
|
18天前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
20 0
|
19天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
8天前
|
C语言
c语言指针总结
c语言指针总结
13 1
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
|
5天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
12 2
|
13天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
14天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
15天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
10 2
|
16天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
16天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)