当前位置: 首页 > news >正文

C语言----函数、指针、数组

目录

​编辑

指针函数

本质

格式:

函数指针

1、 概念

2、 格式

3、 举例

3.1基本用法

3.2函数指针作为函数参数的用法(回调函数)

函数指针数组

1. 概念

2. 格式

3. 例子


指针函数

本质

是函数,返回值为指针

格式:

数据类型 *函数名(形参列表)

{

函数体

return 指针/地址; //return NULL; 一般表示返回失败的情况

}

实例:

char *fun()
{//buf是局部的,函数调用结束空间释放,自己写程序时不可以这样写//char buf[32] = "hello";  //想要实现在函数外能拿到hello字符串,方式如下://方式一:char *buf = "hello"; //"hello"存在常量区//方式二:char *buf = (char *)malloc(32); //在堆区开辟空间strcpy(buf, "hello");return buf;
}
int main(int argc, char const *argv[])
{char *p = fun();printf("%s\n", p);  free(p);p = NULL; return 0;
}

思考:封装一个函数,获取堆区空间的首地址。

//方式一:通过函数的返回值拿到堆区空间首地址
// char *getmemory(int n)
// {
//     char *p = (char *)malloc(n); //成功:首地址,失败:NULL
//     if(p == NULL)
//         return NULL;
//     return p;
// }
//方式二:通过函数参数拿到堆区空间首地址
void getmemory(char **p, int n)
{*p = (char *)malloc(n);
}
int main(int argc, char const *argv[])
{// char *m = getmemory(32);char *m = NULL;getmemory(&m, 32);strcpy(m, "helloworld");printf("%s\n", m);return 0;
}

函数指针

1、 概念

本质是指针,指针指向函数的指针

2、 格式

数据类型 (*指针名)(形参列表);

数据类型:指向的函数的返回值类型

形参列表:和指向的函数的参数一致,此处形参列表可以只保留数据类型,变量名可以省略,如:int (*p)(int, int);

3、 举例

3.1基本用法

int add(int a, int b)
{return a+b;
}
int sub(int a, int b)
{return b-a;
}
int main(int argc, char const *argv[])
{//函数指针int (*p)(int, int) = add; //函数名代表函数的入口地址p = sub; //改变指针的指向,指向sub函数printf("%d\n", add(3, 4));printf("%d\n", p(3, 4));return 0;
}

3.2函数指针作为函数参数用法(回调函数)

int sub(int a, int b)
{    return b-a;
}
int add(int a, int b)
{    return a+b;
}
//函数指针作为函数参数
int test(int a, int b,int (*p)(int, int))
{return a+b+p(1, 3);
}
int main(int argc, char const *argv[])
{    //可以给test函数传递不同的函数,实现代码的复用printf("%d\n", test(10, 20, add));printf("%d\n", test(10, 20, sub));return 0;
}

注意:后面学习中常见的使用流程:

系统给提供包含函数指针的函数接口,用户调用此函数,并自定义函数给函数指针传参

函数指针数组

1. 概念

本质是数组,数组中存放函数指针(指向函数的指针)

2. 格式

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

如:int (*arr[3])(int, int) = {函数名};

3. 例子

int add(int a, int b)
{return a+b;
}
int sub(int a, int b)
{return a-b;
}
int mul(int a, int b)
{return a*b;
}
int main(int argc, char const *argv[])
{//函数指针数组1.  // 定义时赋初值int (*arr[3])(int, int) = {add, sub, mul};2.  // 定义时未赋初值,需要单个元素赋值int (*arr[3])(int, int);arr[0] = add;arr[1] = sub;arr[2] = mul;for(int i = 0; i < 3; i++)printf("%d\n", arr[i](3, 4));return 0;
}

练习:

1. 用变量a表示下面定义

a) 一个整型数

b)一个指向整型数的指针

c)一个指向指针的的指针,它指向的指针是指向一个整型数

d)一个有10个整型数的数组

e) 一个有10个指针的数组,该指针是指向一个整型数的。

f) 一个指向有10个整型数数组的指针

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

http://www.lryc.cn/news/515408.html

相关文章:

  • 基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】
  • 12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)
  • 【数据仓库】hadoop3.3.6 安装配置
  • 小试牛刀-SpringBoot集成SOL链
  • 批量插入报错: No value specified for parameter
  • VSCode设置ctrl或alt+mouse(left)跳转
  • Crosslink-NX应用连载(12):如何复用特殊功能管脚
  • ‘元素.style.样式名‘获取不到样式,应该使用Window.getComputedStyle()获取正真的样式
  • 双目视觉:reprojectImageTo3D函数
  • Arduino Uno简介与使用方法
  • 深入了解 StarRocks 表类型:解锁高效数据分析的密码
  • L27.【LeetCode笔记】2 的幂(五种解法)
  • Pentaho Kettle迁移至Oracle的空字符串和NULL的问题处理,大坑!
  • 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
  • 2.C语言基础:语句、表达式、注释与标准库简介
  • Python 基于 opencv 的人脸识别监控打卡系统(源码+部署)
  • Maven的依赖管理
  • 数据结构考前一天
  • 获取 Astro Bot AI 语音来增强您的游戏体验!
  • html5开发,js 在元素div id=img1的最前面插入一个图片
  • Elasticsearch Serverless中的数据流自动分片深度解析
  • 2025考研江南大学复试科目控制综合(初试807自动控制原理)
  • Elasticsearch分片数量是什么意思?
  • PWN的知识之栈溢出
  • java.lang.Error: FFmpegKit failed to start on brand:
  • TCPDump参数详解及示例
  • Spring如何实现管理事务
  • windows C#-接口中的索引器
  • Launcher3主页面加载显示流程分析
  • 【读书笔记·VLSI电路设计方法解密】问题36:一个好的设计流程有哪些特点