首页 > 其他分享 >C语言函数和指针的关系之三(完结)

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

时间:2023-10-12 23:31:49浏览次数:41  
标签:return 函数 temp int 之三 C语言 num 完结 函数指针


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

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);
。。。。
}

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

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;
}

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

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;
}

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



标签:return,函数,temp,int,之三,C语言,num,完结,函数指针
From: https://blog.51cto.com/u_16265376/7836304

相关文章

  • Linux C语言Shared Library共享库细节探究
    开发中遇到一个问题,比如有一个类库A,被类库B引用,类库B和类库A都被程序C引用。类库A中有一个全局变量G,要求同一个进程中使用的是同一个全局变量G。虽然看起来很简单,但是实际探究下来还有不少坑。如果不是类库如果AB都不是类库,而是直接引入源码编译,理论上比较方便解决。示例一p......
  • 关于c语言操作libwebsockets示例
    第一步,安装libwebsockets库,c语言编写的,默认安装引用库,配置相应的库及路径第二步:上代码main.h ////CreatedbyAdministratoron2020/5/1.// #ifndefMEDIA_MAIN_H#defineMEDIA_MAIN_H #define boolchar volatileintexit_sig=0; #defineMAX_PAYLOAD_SIZE 10......
  • 只有三行代码的神奇云函数的功能之三:100%成功获取unionid [纯转]
    微信小程序这是一个神奇的网站,哦不,神奇的云函数,它只有三行代码:(真的只有三行哦)云函数:loginindex.js:constcloud=require('wx-server-sdk')cloud.init()exports.main=async(event)=>{return{...event,...cloud.getWXContext()}} 神奇功能之三:100%成功获取unio......
  • C语言函数和指针的关系之二(未完)
    指针作为函数的返回值一个函数可以返回整型数据、字符数据、浮点型的数据,也可以返回一个指针.例30:char*fun(){charstr[100]="helloworld";returnstr;}intmain(){char*p;p=fun();printf("%s\n",p);//}//总结:返回地址的时候,地址指向的内存的内容不能释放如果返回......
  • [C语言快速入门] 基础知识和基本数据类型
    [C语言快速入门]基础知识和基本数据类型这里主要的知识点主要来自这两个教学视频:史上最强最细腻的linux嵌入式C语言学习教程【李慧芹老师】_哔哩哔哩_bilibiliC语言基础入门_C3程序猿_哔哩哔哩_bilibili这本书:《CPrimerPlus(第6版)中文版》在本文开篇之前,想简单写一下关于......
  • 仅作笔记用:C语言 将结构体以二进制形式写入文件
    直接以文本文件的方式写入固然也可以,但是如果遇到数据量大的情况,会占用比较多的磁盘空间。这里收集汇总了一下将结构体数据写入二进制文件以及后续读取为结构体的办法。写入二进制文件的话,成员变量就可以直接以例如int、float、double这样的形式存储到磁盘,而不是转换成字符串,这......
  • C语言 - 预处理
    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符......
  • C语言 - 预处理器
    C预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把C预处理器(CPreprocessor)简写为CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符......
  • 复习课15 C语言作业讲解
    一.选择题1.以下哪一项不属于C语言内置的数据类型()A.intB.shortC.structStrD.float答案:C解析:C语言中内置的数据类型有:intshortfloatdoublelongchar等,并不包含C选项中的structStr,故选C2.局部变量的作用域是()A.main()函数内部B.整个程序C.main()函数之前D.局部变量所在地局部......
  • C语言编写的“猜数字“小游戏
    2023年10月7日,今天给大家带来的是用C语言编写的一个猜数字小游戏,使用了循环就可以完成  首先我们需要先做一个简单的目录,这样方便多次使用,增加了游戏的可玩性,看代码: 1voida_catalogue()2{3printf("************************************\n");4prin......