test7

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


博主介绍:

CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;

阿里云社区专家博主;

华为云社区云享专家;

51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。


【数组指针与函数指针】


专栏:《精通C语言》


前言

数组指针和函数指针都是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); //通过函数指针调用函数

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

c 复制代码
typedef int (*func)(int a, int b); //定义了一个函数指针类型

func func1 = &get_num; //使用函数指针类型func定义函数指针变量func1

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

c 复制代码
typedef int (func)(int a, int b); //定义了一个函数类型
func* func1 = &get_num;

func1(1, 1); //间接调用

函数指针约定了函数的返回值和函数参数,功能开发者只要根据这个约定实现功能函数,就可以通过以函数指针为参数的统一接口进行调用,来使用这个函数的功能,实现了功能开发与功能使用的解耦合。这就是函数指针的巨大作用:函数指针做函数参数

具体函数指针做函数参数的应用详解请看我的另一篇文章:
回调函数

另外函数指针的正向调用使用场景,比如通过把动态库加载到程序中,在动态库中查找到函数入口地址来调用函数。

数组指针与指针数组

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

数组指针举例

c 复制代码
#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;
}
相关推荐
Unity官方开发者社区1 小时前
团结引擎动画系统|Event Graph CodeGen:一键编译图逻辑,提升运行时性能
深度学习
湘美书院--湘美谈教育1 小时前
湘美谈教育AI经验集锦:有些东西,它们很难蒸馏
大数据·人工智能·深度学习·机器学习
xixixi777772 小时前
空天地通信、高速光模块、AI 智能体攻击、同态加密芯片四大事件解读:AI 算力底座攻防与全域通信同步升级
大数据·人工智能·深度学习·ai·大模型·光模块·智能体
快乐得小萝卜2 小时前
论文:π0.5
笔记·深度学习
路人甲3262 小时前
SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control
人工智能·深度学习·计算机视觉·机器人·具身智能
湘美书院--湘美谈教育2 小时前
湘美谈教育AI经验集锦:细分领域的标准定义者
大数据·人工智能·深度学习
keykey6.3 小时前
迁移学习实战:用预训练模型做图像分类
开发语言·人工智能·深度学习·机器学习
装不满的克莱因瓶3 小时前
深入PyTorch模型的训练与可视化 —— 掌握迁移学习等模型训练效果提升的办法
人工智能·pytorch·python·深度学习·神经网络·ai·迁移学习
大江东去浪淘尽千古风流人物3 小时前
【VGGT-Ω】前馈式3D重建的规模化之路:Register Attention、自监督训练与10B参数Scaling Law深度解析
深度学习·计算机视觉·transformer·slam·vio·3d重建
Wenzar_3 小时前
用 JAX 构建可微分光子神经网络仿真器
java·人工智能·深度学习·神经网络