数组指针与函数指针

在这里插入图片描述

欢迎关注博主 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.mzph.cn/news/206421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超参数优化的多功能贝叶斯优化包SMAC3

地址 关键词 Bayesian optimization, hyperparameter optimization, SMAC3 文章概述 本文介绍了SMAC3&#xff0c;一个用于超参数优化的多功能贝叶斯优化包。SMAC3使用随机森林作为代理模型&#xff0c;并结合了多样性的BO和强化策略&#xff0c;如积极竞赛和多样性方法…

《算法面试宝典》--数学基础知识

第一章 数学基础 ========================= 深度学习通常又需要哪些数学基础?深度学习里的数学到底难在哪里?通常初学者都会有这些问题,在网络推荐及书本推荐里,经常看到会列出一系列数学科目,比如微积分、线性代数、概率论、复变函数、数值计算、优化理论、信息论等等…

C++ 把引用作为参数

我们已经讨论了如何使用指针来实现引用调用函数。下面的实例使用了引用来实现引用调用函数。 #include <iostream> using namespace std;// 函数声明 void swap(int& x, int& y);int main () {// 局部变量声明int a 100;int b 200;cout << "交换前…

Python编程技巧 – 异常处理

Python编程技巧 – 异常处理 Python Programming Skills – Exception Handling By JacksonML 每一个程序都未必是健壮的&#xff0c;有时候很脆弱。只有在人的理想思维状况下&#xff0c;返回的结果才是正确的&#xff0c;如意的。 1. 错误发生及异常输出 面对种种编写有疏…

PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)

如何选择合适的字幕添加进短视频呢&#xff1f;首先要先确定增加的视频风格&#xff0c;简约、商务、科技感、炫酷&#xff1b;再确定用途&#xff0c;注释、标记、语音翻译、引用、介绍&#xff1b;最后在相应的模板中挑选几个尝试&#xff0c;悬着一个最切合主题的使用&#…

推荐的国外自动控制原理优秀教材:现代控制系统

推荐国外著名高等院校信息科学与技术优秀教材《现代控制系统》&#xff08;Modern Control Systems&#xff09;&#xff0c;全书930页。自动控制原理课程教程,控制系统基础教材,涵盖控制工程方法,大量例题详细演示设计流程,电子版教学PPT和教学辅导手册供师生使用。 现代控制…

[Java面试——Java 新版本]

Java 8版本特性&#xff0c;及Java8版本特性。 6.1 Java 8 特性 什么是函数式编程&#xff1f;Lambda表达式&#xff1f; 函数式编程 面向对象编程是对数据进行抽象&#xff1b;函数式编程是对行为进行抽象。 核心思想: 使用不可变值和函数&#xff0c;函数对一个值进行处理…

23、文件上传漏洞——Web容器及IIS

文章目录 一、常见web容器1.1 名词解释1.2 什么是web容器 二、IIS简介2.1 什么是IIS2.2 什么是文件解析 三、IIS6.0 文件解析漏洞3.1 漏洞利用 一、常见web容器 1.1 名词解释 服务器&#xff1a;一种管理资源并为用户提供服务的计算机。 web服务器&#xff0c;即www服务器或h…

C语言三种循环输出9*9乘法表

解题思路&#xff1a; 1、外层循环控制1~9循环 2、内层控制循环的次数 比如&#xff1a; 1 * 1 1 循环一次 1 * 1 1 1 * 2 循环两次 依此类推 int i, j;printf("for 打印9*9乘法表\r\n");for(i 1; i <10; i) {for(j 1; j < i;j) {printf("%d * %d %d…

AIGC: 关于ChatGPT中实现一个聊天机器人

规划一个聊天机器人 智能化完全于依托于GPT, 而产品化是我们需要考虑的事情比如&#xff0c;如何去构建一个聊天机器人聊天机器人它的处理逻辑其实非常的清晰 我们输入问题调用 GPT然后&#xff0c;GPT 给我们生成回答就可以了 需要注意的是&#xff0c;聊天机器人不同于调用A…

QT----自定义信号和槽

第二天 2.1自定义信号和槽 新建一个Qtclass 自定义信号&#xff1a;返回值是void &#xff0c;只需要声明&#xff0c;不需要实现&#xff0c;可以有参数&#xff0c;可以重载 自定义槽&#xff1a;返回值void &#xff0c;需要声明&#xff0c;也需要实现&#xff0c;可以有…

学习设计模式的一个好网址

常用设计模式有哪些&#xff1f; (refactoringguru.cn)https://refactoringguru.cn/design-patterns

网神SecGate 3600防火墙 app_av_import_save接口任意文件上传漏洞复现 [附POC]

文章目录 网神SecGate 3600防火墙 app_av_import_save接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议网神SecGate 3600防火墙 app_av_import_save接口任意文件上传漏洞复现 [附PO…

如何处理3dmax渲染完成后阴影部分?

使用3dmax软件&#xff0c;对效果图进行渲染过程中&#xff0c;有不少小伙伴&#xff0c;在渲染完成后出现问题。 较为常见的3dmax渲染问题有3dmax渲染有阴影&#xff1f; 对于一些新手伙伴遇到这类问题&#xff0c;不知如何解决&#xff0c;就会苦恼3dmax渲染有阴影怎么办&am…

Java可变参数:让函数接受任意数量的参数

介绍 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了方法的参数类型已经确定,个数不确定我们可以使用可变参数 可变参数定义格式 修饰符 返回值类型 方法名(数据类型… 变量名){} 注意事项 这里的变量其实是一个数组如果一个方法有多个参数,包…

【实战oj题】——相同的树及二叉树的最大深度

前言&#xff1a;二叉树是我们数据结构中一个比较重要的内容&#xff0c;它的oj题自然也就很多类型&#xff0c;那么我们今天就来解决二叉树中的oj题——相同的树。 这个题我们就得分情况了&#xff0c;如果两个树的根节点都为空的话&#xff0c;那么两棵树就会相等&#xff0c…

如何在Go中定义和调用函数

引言 函数是一段一旦定义就可以重用的代码。函数将代码分解成小的、可理解的任务,使其在程序中可以多次使用,从而使代码更容易理解。 Go附带了一个强大的标准库,其中有许多预定义的函数。你可能已经从fmt包中熟悉了以下内容: fmt.Println(),它将打印对象到标准输出(最有可…

西南科技大学C++程序设计实验十一(泛型程序设计与C++标准模板库)

一、实验目的 1. 掌握泛型程序设计概念; 2. 掌握vector、deque、list容器使用方法; 3.了解set、map容器使用方法。 二、实验任务 1.分析完善以下程序,理解vector容器使用方法: #include <iostream> __#include <vector>_______ //补充vector模板头文件 …

【开源】基于Vue.js的学生综合素质评价系统

文末获取源码&#xff0c;项目编号&#xff1a; S 086 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S086。} 文末获取源码&#xff0c;项目编号&#xff1a;S086。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能…

YB4052 充满电压可调SOT23有防反接功能的线性锂离子电池充电芯片

YB4052 充满电压可调SOT23有防反接功能的线性锂离子电池充电芯片 描述&#xff1a; YB4052是一款完整的单节钾高子申池采用恒定申流恒定申乐线件充电器。其S0T封装与较少的外部元件数目使得B4052成为便携式应用的理想洗择。YB4052可以话合SB申源和活配器电源工作。由于采用了…