一些关于指针的补充

指针与二维数组

上篇文章我们说了
指针数组相当于是一个二维数组
比如
#include<stdio.h>
int main(){
	int a[] = {1,2,3};
	int b[] = {4,5,6};
	int *p1 = a,*p2 = b; 
	int *p[2] = {p1,p2};
	printf("%d",*p[0]);
	
	我们看这一段代码
	首先定义了两个数组分别是ab
	然后定义了两个指针分别指向a和b(这里的指向是指向其中第一个元素为了方便书写后面就不累述了)
	然后创建一个指针数组p里面包含两个元素p1和p2
	那么这个指针数组里就可以索引到
	1 2 3
	4 5 6这些数据
	那么其实
	1 2 3
	4 5 6
	这个是一个2 * 3的二维数组
	这个时候就有人说了 你这个二维数组这么麻烦,有啥用

	首先我们要知道二维数组比如下面这个啊
	int a[][4] = {{1,2,3,4},{5,6,7,8}};
	我们在创建二维数组的时候是可以省略行,但必须要固定列的
	所以这个列是相等的。

	而通过指针数组我们可以将指针指向不同长度的数组
	比如
	
	int a[] = {1,2,3};
	int b[] = {4,5,6,7,8,9};
	int *p1 = a,*p2 = b; 
	int *p[2] = {p1,p2};

	printf("%d",*(p[1]+4));

	这里就是定义的a和b的长度不同
	但是仍可以通过*(p[1]+4)来访问b数组里的第5个元素而a里是不存在第五个元素的 
}

二维数组的数组名

我们之前讲了一维数组的数组名是数组中第一个元素的地址
那么二维数组的数组名是什么呢?
我们来理下逻辑
int a[] = {1,2,3};
a代表的是1的地址,因为1是数组a中的第一个元素

int b[][3] = {{1,2,3},{4,5,6}};
那么这个二维数组中第一个元素是什么呢
或者我们换一个想法
我们刚刚讲了其实二维数组和指针数组有相似之处
那么一个指针数组
int *p[2] = {p1,p2};
这个指针数组p中,第一个元素就是一个p1对吧
那么p1是一个指针,那么第一个元素的地址就是指针的地址

我们再看向二维数组
int b[][3] = {{1,2,3},{4,5,6}};
那么这个第一个元素就是{1,2,3}这个数组,那么这个地址是什么呢
那就是这个数组的地址,
这个我们是不是之前学过,没错
我们再给数组指针赋值的时候就说了数组指针指向的就是数组的地址,
所以说
二维数组的数组名,其实是一个数组指针,是一个指向这个二维数组中第一行的一个
数组指针

当然可能讲到这里大家可能还是不怎么懂,我们讲完索引之后可能就好一些

关于这个通过数组名进行索引
我们先来证实一下上面的猜想是不是对的
看以下代码
#include<stdio.h>
int main(){
// 这里是创建了一个2*3的二维数组
	int b[][3] = {{1,2,3},{4,5,6}};
// 这里是创建了一个数组指针指向b中的第一个数组的位置
	int (*p)[3] = &b[0];
// 分别打印
	printf("%d\n",b);
	printf("%d",p); 
}
这个的运行结果就是下图

在这里插入图片描述

可以看见啊这个的地址是一样的所以说,我们上述猜想是正确的,
然后再来讲索引
比如我们对二维数组的数组名取值是什么呢
int b[][3] = {{1,2,3},{4,5,6}};
比如这个数组
我们取*b得到的结果是什么呢?
没错应该就是b中第一个数组的数组名
而这个数组名是指向该数组中的第一个元素的指针
所以*b得到的还是一个地址,是第一个数组中第一个元素的地址
也就是在这里是1的地址
所以我们再加一个*就得到了1
也就是**b得到的就是1
	int b[][3] = {{1,2,3},{4,5,6}}; 
	printf("%d",**b);

在这里插入图片描述

依次我们可以发现其实二维数组数组名的使用其实就是数组指针的使用,如果还有不懂的可以回去看上一篇文章
红豆泥阿里嘎多!

void指针和NULL指针

关于这个就简单的提一下
首先当一个指针被定义成void类型时
我们都知道void是无类型,而我们在使用指针的调用时,
是根据指针的类型来确定空间的,所以如果一个指针被定义成void
在调用的时候应该先转成别的指针类型再取值

转换方法就是*int *char这种

然后就是NULL指针
首先我们要知道NULL时一个常量
他是一个指向空的一个指针,也就是地址

所以当我们定义一个指针
int *p;
p这个时候是没有被赋值的
这个时候对其取值也就是说*p得到的结果就是一个随机的地址

而如果定义
int *p = NULL;
这个时候再取值,得到的结果就不是地址了,而是空

在这里插入图片描述

在这里插入图片描述

今天的学习就到此为止了

@2022 5 3 ;

还是3円吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值