进阶指针知识点总结

【AAAI2025】【小目标检测】FBRT-YOLO:更快速、更优的实时航拍图像检测方法 FBRT-YOLO是一种新型实时航拍图像检测方法,针对小目标检测的精度与效率平衡问题提出创新解决方案。该方法通过两个轻量级模块显著提升性能:特征互补映射模块(FCM)将浅层空间位置信息深度整合至网络深层,缓解信息失衡;多核感知单元(MKP)采用多尺度卷积增强多目标感知能力。实验表明,在VisDrone、UAVDT和AI-TOD数据集上,FBRT-YOLO在检测精度和速度方面均优于现有实时检测器,特别适用于资源受限的飞行设备。该模型通过精简网络结构,在保持高性能的同时降低了计算负担,为航拍实时检测提供了高效解 阅读详情

今天分享一个自己总结的关于进阶指针的知识点:

1.数组指针

数组指针和指针数组是两个挺绕口的名词,但是两个的意思截然不同,一个是指针,一个是数组。今天主要讲数组指针。
举例如下:

int (*p) [5]       

这是一个数组指针,因为*首先和p结合代表他是个指针标量,然后指向了一个大小为5的整形数组。
注: [ ] 的优先级高于 *
对于一个int型数组arr[5]来说,arr和&arr分别代表什么?
下面可以通过一个实例来理解:

int a[5] = {0};
printf("%p\n",a);
printf("%p\n", &a);
printf("a+1 = %p\n ", a + 1);
printf("&a+1 = %p\n",&a+1);

在这里插入图片描述
这里可以看到a和&a的值一样,但两者所表示的意义截然不同,a表示数组首元素的地址,&a表示数组的地址,所以也就导致后面a+1和&a+1的值不一样,a+1表示跳过数组的一个元素的结果,而&a+1表示跳过整个数组的结果。

下面举一个数组指针的使用案例:

#include<stdio.h>
#include<stdlib.h>

void print_arr(int(*arr)[5], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
    int arr[3][5] = {1,2,3,4,5,6,7,8,9,10};
	print_arr(arr, 3, 5);
	system("pause");
	return 0;
}

这个例子中可以看到在调用print_arr()函数时,实参为arr,3,5;同时print_arr函数的形参为int(*arr)[5],3,5;为什么要用int(*arr)[5]来接收arr呢?因为arr代表二维数组首元素的地址,二维数组可以看成是每个元素是一个一维数组的数组;多维数组都可以化为一维数组,所以二维数组的首元素是二维数组的第一行,这里传递的arr就相当于第一行的地址,所以可以拿一个数组指针来接收。

2.函数指针

函数指针当然就是形象化出的指向函数的指针,举例如下:

void(*p) ( )   这里可以看到*首先和p构成一个指针,然后指向一个返回值为void,接收参数为空的函数。( )在这里就起到了调用的作用!

阅读一行代码:
void ( * signal (int ,void ( * ) (int) ) ) (int) ;
看到这里我想不少人有点懵了,这个该怎么分析,最好就是使用typedef来简化这行代码,能让分析变得简单点,化简如下:

typedef void (*pfun) (int) ;
pfun signal (int,pfun);

化简成这样我相信大家就能看明白了。

3.函数指针数组

函数指针数组首先要明确他是一个数组,每个元素是一个函数指针。
举例如下:

int (*arr[5]) () ;

arr首先和[]结合代表arr是一个数组,数组的内容是int (*) ( ),每个元素就是一个函数指针。
函数指针数组的用途:转移表
举例如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

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 div1(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = {0,add,sub,mul,div1}; //这里定义了一个函数指针数组,每个数组元素都是一个指向函数的指针
	while (input)
	{
		printf("*********************\n");是一个
		printf("**1.add       2.sub**\n");
		printf("**3.mul       4.div1**\n");
		printf("*********************\n");
		printf("请选择:");
		scanf("%d",&input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y); //此处输入input,x,y的值通过相应的指针来调用相应的函数达到计算效果
		}
		else
			printf("输入有误!");
		printf("ret = %d\n",ret);
	}
	system("pause");
	return 0;
}

可以看到上面的代码量比一般的思维写出的代码要少不少,一般最容易想到的就是switch,case来实现这个功能了,但是代码量较上面这种方法来说要多一些。

4.指向函数指针数组的指针

这句话看起来很绕口,但首先要明白他是一个指针,指向一个函数指针数组,举例如下:

void (*pfun) (char*) = test;       //这是一个函数指针 
void (*pfun[5]) (char*);            //这是一个函数指针数组
void (*(*p)[5]) ( char*) = &pfun;       //这是一个指向函数指针数组的指针

5.回调函数

回调函数算是很重要的一个知识点,因为他是函数指针的一种应用。
下面关于回调函数的应用举例请查看我的另一篇文章。
https://blog.youkuaiyun.com/Python_programer/article/details/88548816

指针校招笔试常考题

    int a[] = {1,2,3,4};
	printf("%d\n", sizeof(a));   //16个字节因为是计算整个数组大小
	printf("%d\n", sizeof(a+0)); //4个字节因为数组名+数字隐式转化为指针,是指针就是四个字节
	printf("%d\n", sizeof(*a));  //4个字节因为数组名代表首元素地址,解引用就是代表首元素的大小
	printf("%d\n", sizeof(a+1)); //4个字节原因同第二个
	printf("%d\n", sizeof(a[1])); //4个字节因为是数组第二个元素的大小
	printf("%d\n", sizeof(&a));   //4个字节因为&a代表数组指针,是指针就是四个字节
	printf("%d\n", sizeof(*&a));  //16个字节因为先&a代表数组指针,再解引用就是代表整个数组的大小
	printf("%d\n", sizeof(&a+1));  //4个字节因为&a代表数组指针再+1还是指针,仍然是四个字节
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
	printf("%d\n", sizeof(arr));     //6个字节因为是求整个数组大小
	printf("%d\n", sizeof(arr + 0));  //4个字节因为数组名+数字隐式转化为指针,是指针就是四个字节
	printf("%d\n", sizeof(*arr));     //1个字节因为是数组首元素大小
	printf("%d\n", sizeof(arr[1]));   //1个字节因为是数组第二个元素的大小
	printf("%d\n", sizeof(&arr));     //4个字节因为&arr表示数组指针
	printf("%d\n", sizeof(&arr + 1));  //4个字节同上
	printf("%d\n", sizeof(&arr[0] + 1)); //4个字节因为&a[0]表示指针
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
    printf("%d\n", strlen(arr));      //这几个都是未定义行为,因为比如第一个strlen函数求的是字符串长度遇到'\0'就会停止,而arr是字符数组没有'\0',所以就会一直计算下去知道'\0'为止,而再往后就会造成数组越界,访问非法内存,是未定义行为!
	printf("%d\n", strlen(arr + 0));  
	printf("%d\n", strlen(*arr));     
	printf("%d\n", strlen(arr[1]));   
	printf("%d\n", strlen(&arr));     
	printf("%d\n", strlen(&arr + 1)); 
	printf("%d\n", strlen(&arr[0] + 1));
    char arr[] = "abcdef"; 
	printf("%d\n", sizeof(arr));   //7个字节因为上面这个arr是字符串带有'\0',所以数组总大小是7
	printf("%d\n", sizeof(arr + 0)); //4个字节因为数组名+数字隐式转化为指针,是指针就是四个字节
	printf("%d\n", sizeof(*arr));   //1个字节因为是数组首元素大小
	printf("%d\n", sizeof(arr[1]));  //1个字节因为是数组第二个元素的大小
	printf("%d\n", sizeof(&arr));    //4个字节因为&arr是数组指针
	printf("%d\n", sizeof(&arr + 1)); //4个字节原因同上
	printf("%d\n", sizeof(&arr[0] + 1)); //4个字节因为&arr[0]是指针
    char arr[] = "abcdef"; 
    printf("%d\n", strlen(arr));      //6个字节因为是字符串带有'\0',所以数组大小为6
	printf("%d\n", strlen(arr + 0));  //6个字节因为数组名+0还是指向首元素的,所以数组大小还是6个字节
	printf("%d\n", strlen(*arr));     //未定义
	printf("%d\n", strlen(arr[1]));   //未定义
	printf("%d\n", strlen(&arr));    //6个字节但是是越界访问结果
	printf("%d\n", strlen(&arr + 1));  //未定义
	rintf("%d\n", strlen(&arr[0] + 1));//5个字节因为&a[0]是取首元素地址,再加上1表示跳过了一个元素,所以再strlen的话就是五个字节。
    char *p = "abcdef"; 
    printf("%d\n", sizeof(p));     //4个字节因为p是指针指向这个数组的首元素
 	printf("%d\n", sizeof(p + 1));  //4个字节因为指针加1还是指针
	printf("%d\n", sizeof(*p));     //1个字节因为*p解引用是首元素
	printf("%d\n", sizeof(p[0]));   //1个字节因为是数组第二个元素
	printf("%d\n", sizeof(&p));     //4个字节因为&p表示二级指针   
	printf("%d\n", sizeof(&p + 1));  //4个字节原因同上
	printf("%d\n", sizeof(&p[0] + 1));  //4个字节因为&p[0]+1表示的是一个指针

注:sizeof()是在编译时求值,而strlen()是在运行时求值!

汽车行业新能源汽车数据爬虫:抓取新能源汽车数据,分析市场发展和技术创新 在汽车行业,新能源汽车市场的发展和技术创新是当前的热点话题。通过抓取新能源汽车的数据,我们可以深入了解市场趋势、消费者需求以及技术创新的方向。本文将详细介绍如何使用 Python 爬虫技术抓取新能源汽车数据,并对数据进行分析和可视化展示。 阅读详情

相关推荐

原创_新魔百和CM201-1鸿蒙架构当贝乐家语音安卓9线刷固件包刷机教程可救砖rom刷机包

不用担心变砖,因为系统内核会自动判断分区及CPU等级,假设你CPU是高于S905L3的那么。7.adb功能支持,系统增加开机自启功能,添加老人桌面模式,默认为年轻化桌面;所以我发的这个固件可适用于_cw_ys_zg_zn代工上生产的盒子进行刷机;5.CPU及GPU算法更改,当观看4K片源时,AI智能会自动优化系统后台进程,正如我所说,本固件是采用安卓公版镜像制作而成,那么代工厂也是使用的公版镜像,1.移植鸿蒙架构代码,完美融合安卓系统,增加系统的稳定性;刷机的时候 他会自动短接链接,所以不存在变砖。

a138088150的博客 1万+

python打开文件_Python入门基础知识点总结,一点文章就能让你看懂Python

Python标识符在 Python 里,标识符有字母、数字、下划线组成。在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。Python 中的标识符是区分大小写的。以下划线开头的标识符是有特殊意义的。以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;以双下划线开头的 __foo 代...

weixin_39788572的博客 273

六轴机械臂正逆解计算

机械臂运动学就是。包括(Forward Kinematics)和(InverseKinematics)两部分。正运动学就是逆运动学则是关节变量->机械臂末端执行器的姿势=正向运动学机械臂未端执行器的位姿->关节变量=逆向运动学。

gaoxiaochan的博客 1万+

不会指针?还不进来看看——进阶指针详解

指针是C语言的灵魂,不会指针,不知道指针怎么用的,进来看看。

weixin_73888239的博客 1403

前端开发 - 完美解决video.js和flv.js视频同时播放数量限制的问题,即浏览器针对同一域名的请求限制问题(解决flv.js/video.js在页面播放最多不超过6个问题、浏览器并发请求限制数

flv.js,video.js,vue,reactive,uniapp,前端开发,flv视频同时播放有限制怎么办,浏览器限制多个视频同时播放怎么办,使用flv.js在前端播放,最多只能播放6个视频,突破浏览器域名并发限制,如何解决flvjs与videojs视频播放同时播放数量限制,video.js 一个页面同时播放多个视频的实例代码,解决网页视频最大只能播放6路的问题,浏览器只能播放6路http-flv流的解决方法,一个浏览器播放5个或者6个flv的视频就不能播放了,video.js 无法在页面同时播放多个

✅ 精选推荐文章 4995

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2434

C语言指针知识点大全

数组指针是指针?还是数组?答案是:指针。我们已经熟悉: 整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。下面代码哪个是数组指针?//p1, p2分别是什么?解释://解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。//所以p是一个指针,指向一个数组,叫数组指针。//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。OK!

2302_78964455的博客 3380

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

指针几个字节c语言,C语言指针最详尽的讲解

原标题:C语言指针最详尽的讲解 指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程中基本的问题。第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然小伙伴们也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。因为诸如结构体等大型数...

weixin_33001561的博客 603

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 133

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

指针进阶超详解

一、 字符指针 二、数组指针 三、指针数组 四、 数组传参和指针传参 五、函数指针 六、函数指针数组 七、指向函数指针数组的指针 八、回调函数 九、指针和数组面试题的解析

weixin_63246064的博客 1659

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用DynamicConv高效动态卷积改进YOLO26检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

YOLO26作为新一代轻量化目标检测模型的代表,凭借精简的Backbone架构、高效的特征融合 Neck 设计,在实时检测场景(如嵌入式设备、边缘计算)中展现出优异的性能,成为工业落地与科研入门的优选模型。但在实际应用中,YOLO26原生检测头仍存在核心瓶颈:采用固定参数卷积核,无法根据输入特征的目标尺度、纹理差异动态调整卷积权重,导致多尺度目标适配不足、复杂背景下特征利用率低,且传统改进方案往往难以平衡“精度提升”与“轻量化”,要么精度提升有限,要么大幅增加参数量、拖累推理速度。

qq_36130719的博客 372

进阶指针知识点详解(上)

本文带大家详细的了解C语言中的字符指针,数组指针,指针数组,以及函数传参等知识点。

qq_68601751的博客 616

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

指针进阶知识点

指针进阶知识点

m0_72715159的博客 237

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【C语言】指针进阶知识点

指针知识点

moteandsunlight的博客 531

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言指针进阶知识点大全

按照函数方式来返回的 输入char 返回 int (所以int就是1bit 1bit来访问 (char = 1bit) )右边没数了,再往左边看,看到了 ' * ' 说明 p3 有 5 个元素 存的都是地址(5个元素都是指针),// p4先向右看,看到了括号,说明没数了,然后向左看,看到了 ' * ' 说明p4是一个指针。这个数组[5]是 修饰 *p4 指向空间的访问行为的 , 所以 *p4 是按照数组来访问的。接着再往左边看是char说明 *p1 这个指针他指向的空间是1B 1B 的访问的。

2302_77394415的博客 402

【C语言-18】指针的进阶知识点

时间呀!等等我~ 目录: 字符指针 数组指针 指针数组 函数指针 数组传参和指针传参 函数指针数组 指向函数指针数组的指针 回调函数 1.字符指针 一种指针类型为字符指针char* int main() { char ch = 'w'; char *pc = &ch; *pc = 'w'; return 0; } 2.数组指针 ...

weixin_44768184的博客 400

进阶指针知识点

sgsggsg

qq_73617408的博客 194

C语言进阶 - 指针1 - 知识点整理

//代码1: int main() { char ch = 'w'; char* pc = &ch;//pc是指向一个字符串指针变量 char* p = "hello bit"; //"hello bit"是一个常量字符串 - 存放在内存的常量区,是不允许更改的,更改就会导致err //上面表达式的作用是:把常量字符串"hello bit"的第一个字符h的地址赋值给p printf("%c\n",*p);//可以看出指针p存放的是字符h的地址 printf("%s\n".

qq_53010164的博客 865

进阶指针知识点详解(下)

本文接指针进阶(上),带大家详细的了解函数指针,和函数指针数组的相关知识。

qq_68601751的博客 411

C语言指针进阶知识点

数组名通常表示的是首元素的地址,但是有两个例外:1.sizeof(数组名),此时数组名表示的是整个数组。2.&数组名,表示的是整个数组的地址。打印一维数组时建议使用int* pi = arr;而不是int(*p)[10] = &arr;二维数组在内存中是连续存放的,但是模拟实现指针数组实现二维数组却不一定连续。对于函数来说函数名与&函数名都是函数的地址,Add与&Add二者等价。

weixin_69723839的博客 170

C语言:指针进阶-->核心知识点全解析

本文全面解析C语言指针进阶知识,涵盖指针数组与数组指针的区别、二级指针应用、函数指针与回调机制、数组传参退化规则等核心内容。重点剖析易混淆概念,如指针数组(元素为指针的数组)与数组指针(指向整个数组的指针)的本质差异,二级指针修改原指针指向的原理,以及回调函数在通用算法设计中的关键作用。文章通过代码示例对比分析内存模型,总结面试高频考点与常见易错点,包括二维数组传参类型匹配、sizeof在函数内的行为等。掌握这些知识点是突破C语言进阶的关键,对数据结构和工程开发具有重要基础作用。

x1649545783的博客 509

C语言学习 - 指针进阶知识点总结(下)

指针进阶知识点总结

Jiali的博客 510

C语言进阶 - 指针2 - 知识点整理

目录 一、一维数组传参: 二、二维数组传参: 三、一级指针传参: 四、二级指针传参: 五、函数指针: 六、俩段有趣的代码: 七、函数指针数组: 八、函数指针数组的应用:计算器 九、辨认3个指针: 1.指向整形数组的指针 2.指向整形指针数组的指针 3.指向函数指针数组的指针 一、一维数组传参: //代码1: //一维数组传参,既可以写成数组,也可以写成指针 //1. void test(int arr[]) {} //2. v...

qq_53010164的博客 1109

C语言学习 - 指针进阶知识点总结(上)

我们知道计算机内存被细分为以字节为单位的空间大小,每块字节空间都有一个唯一的内存编号(由硬件产生),如同酒店房间的门牌号一样。我们通过内存编号就可以快速的找到需要的那块空间。指针其实就是指针变量,用来存放其他空间的内存编号的,这个编号就是内存的地址,也形象的称之为指针——指向内存空间。口语中常说的指针(地址)就是指针变量。......

Jiali的博客 247
上一篇: 回调函数的应用
下一篇: Linux常用命令
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值