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

数组指针与函数指针

在这里插入图片描述

欢迎关注博主 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])); //典型错误,只把十个字节的内存值为0
	memset(num_array, 0, sizeof(num_array)); //实际应该把40个字节置为0

	PrintArray_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.kler.cn/news/162008.html

相关文章:

  • 《使用ThinkPHP6开发项目》 - 项目使用多应用开发
  • Python 从入门到精通 学习笔记 Day02
  • 神经网络 模型表示2
  • VBA技术资料MF93:将多个Excel表插入PowerPoint不同位置
  • elasticsearch-head 启动教程
  • Python编程技巧 – 异常处理
  • 黑马头条数据管理平台项目总结
  • 离线数仓构建案例一
  • PostgreSQL 索引介绍和使用事项
  • PyQt6 QDateEdit日期控件
  • 【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】
  • 文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》
  • DevOps搭建(一)-之swappiness安装详细步骤
  • Java最全面试题专题---1、Java基础知识(2)
  • 11.Java安卓程序设计-基于SSM框架的Android平台健康管理系统的设计与实现
  • 倚天屠龙:Github Copilot vs Cursor
  • 深入探索C语言中的二叉树:数据结构之旅
  • 【动态规划系列】子数组的最大和
  • java对文件夹,文件操作
  • python操作MySQL——封装增删改查
  • WT2605C蓝牙音频语音芯片:具备大功率IO驱动能力,引领音频技术新纪元
  • 循环中存在异步的情况如何让其正常执行?
  • 突破浅水、低流速,中海达iFlow系列智能型ADCP创新“低”!
  • Module build failed : Error : Vue packages version mismatch:
  • C#中的Attributes特性创建和结合反射应用举例
  • 苏宁商家电话采集软件使用教程
  • 生活、工作常用API免费接口
  • python socket编程6 - 使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的例子
  • 神经网络常用归一化和正则化方法解析(二)
  • axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)