数组指针与函数指针

news/2025/3/19 5:47:42/

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!


博主介绍:
CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;
阿里云社区专家博主;
华为云社区云享专家;
51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。


【数组指针与函数指针】

  • 前言
  • 函数指针语法
  • 数组指针与指针数组


专栏:《精通C语言》


前言

数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。

函数指针语法

定义一个函数指针,并通过函数指针间接调用函数:

int get_num(int a, int b)
{return a + b;
}int (*func)(int a, int b); //定义了一个函数指针func,它指向 返回值为int 参数为 int a, int b的函数func = &get_num; //函数指针指向函数func(1, 2); //通过函数指针调用函数

通过定义一个函数指针类型来定义一个函数指针:

typedef int (*func)(int a, int b); //定义了一个函数指针类型func func1 = &get_num; //使用函数指针类型func定义函数指针变量func1

定义一个函数类型,并使用函数类型来定义一个函数指针

typedef int (func)(int a, int b); //定义了一个函数类型
func* func1 = &get_num;func1(1, 1); //间接调用

函数指针约定了函数的返回值和函数参数,功能开发者只要根据这个约定实现功能函数,就可以通过以函数指针为参数的统一接口进行调用,来使用这个函数的功能,实现了功能开发与功能使用的解耦合。这就是函数指针的巨大作用:函数指针做函数参数
具体函数指针做函数参数的应用详解请看我的另一篇文章:
回调函数
另外函数指针的正向调用使用场景,比如通过把动态库加载到程序中,在动态库中查找到函数入口地址来调用函数。

数组指针与指针数组

数组指针是指向数组的指针;指针数组是指针的数组。

数组指针举例

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>void PrintArray_int(int* array, int len)
{if ((NULL == array) || (len < 0)){printf("err:(NULL == array) || (len < 0)\n");return;}for (int i = 0; i < len; i++){//两种方法访问数组元素//printf(" %d ", array[i]);printf(" %d ", *(array + i));}printf("\n");
}int main()
{//定义一个数组变量int num_array[10];// num_array + 1 移动 sizeof(int) 个字节int len = sizeof(num_array) / sizeof(num_array[0]);//memset(num_array, 0, sizeof(num_array) / sizeof(num_array[0])); //典型错误,只把十个字节的内存值为0memset(num_array, 0, sizeof(num_array)); //实际应该把40个字节置为0PrintArray_int(num_array, sizeof(num_array) / sizeof(num_array[0]));//定义一个数组类型typedef int(array1_t)[];typedef int(array2_t)[10];array1_t a1 = {1, 2, 3};array2_t a2;for (int i = 0; i < 10; i++){a2[i] = i;}PrintArray_int(a1, sizeof(a1) / sizeof(a1[0]));PrintArray_int(a2, 10);//定义一个数组指针int(*p_array)[10];// p_array + 1 移动 sizeof(int) * 10 个字节p_array = &num_array;for (int i = 0; i < 10; i++){(*p_array)[i] = i + 1;}PrintArray_int(*p_array, 10);//定义一个指向数组的指针类型(数组指针)typedef int(*p_array_t)[10];p_array_t p1 = &num_array;for (int i = 0; i < 10; i++){(*p1)[i] = i + 2; //先解引用,还原为一级指针(数组本身可以看为一级指针//数组指针是指向数组的指针,也就是指向一级指针的指针,即二级指针)}PrintArray_int((*p1), 10);//指针数组const char* p2[2] = { "aaa", "bbb" };//p2[0] 和 p2[1] 都是一个指针printf("%s\n", p2[0]);printf("%s\n", p2[1]);system("pause");return 0;
}

http://www.ppmy.cn/news/1261660.html

相关文章

有效解决wordpress的502 Bad Gateway错误提示

摘要&#xff1a;最近有客户反映使用阿里云虚拟云主机&#xff0c;wordpress常提示502 Bad Gateway错误&#xff0c;网关错误是网站上遇到的常... wordpress的502 Bad Gateway错误如何修复&#xff1f; 第1步&#xff1a;偶发错误可尝试重新加载网站 偶尔出现流量突发爆增或是服…

Linux--文件权限与shell外壳的理解

目录 一.Linux的用户与用户切换&#xff0c;提权 二.对文件权限的理解 1.文件权限角色的权限文件属性 2.Linux中的三种角色 3.为什么会存在所属组这个角色 4.文件属性的意义 4.1.第一个字母的意义 4.2 第2——第10个字母的意义 4.3修改文件权限的方法 三.目录权限 四…

企业博客SEO:优化SOP,助您提升搜索引擎可见性

企业博客是互联网时代企业与用户沟通的重要渠道之一&#xff0c;引流成本也比较低。然而&#xff0c;依然有企业会处在3种状态&#xff1a; 1. 有博客&#xff0c;但内容更新不积极或搁置 2. 有博客&#xff0c;但内容散乱 3. 根本就没有博客 如果是这几种状态&#xff0c;…

手把手教你搭建 Ceph+JuiceFS

Ceph 提供了对象存储&#xff0c;可作为存储引擎在 JuiceFS 中使用。这一组合非常适合云计算、大数据分析和机器学习等数据密集型应用场景。 在日常部署中可直接通过 Ceph RADOS 配合 JuiceFS 使用&#xff0c;无需部署 RGW。基于此方案实践以及运维中的常见问题&#xff0c;结…

Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析

1. 文件分析 1. 补充&#xff1a; 什么叫单文件组件&#xff1f; 一个文件中只有一个组件 vue-cli创建的项目中&#xff0c;.vue的文件都是单文件组件&#xff0c;例如App.vue 2. 进入分析 1. package.json: 项目依赖配置文件&#xff1a; 如图&#xff0c;我们说主要的属性…

vue+django 开发环境跨域前后端联调配置

vue环境是127.0.0.1:8080&#xff0c;django环境是127.0.0.1:8000 要解决url相对路径和Axios跨域权限问题。 注意&#xff1a;程序发起了一个 POST 请求&#xff0c;但请求的 URL 没有以斜杠结尾。Django 默认设置是无法执行重定向到带斜杠 URL的。例如&#xff1a;url http:/…

服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?

服务器故障&#xff1a; 由于工作人员的误操作&#xff0c;将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上&#xff0c;导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息&#xff0c;原Ocfs2文件系统数据会遭受一定程度…

数组实现循环队列(增设队列大小size)

目录 一、前言 1.如何实现循环&#xff1f; 2.如何判断队列为空&#xff1f; 3.如何判断队列为满&#xff1f; 二、循环队列的结构定义 三、循环队列的创建及其初始化 四、入队 五、出队 六、取队头元素 七、取队尾元素 八、循环队列判空 九、循环队列判满 十、循环…