C语言—指针数组与数组指针_指针数组和数组指针-程序员宅基地

技术标签: C语言  c语言  visualstudio  

前言:

看到标题的小伙伴可能会有点疑惑,什么是指针数组,数组指针??傻傻分不清楚,不怕,听我慢慢道来。

正文:

要想弄清楚这两个概念,我们不妨举几个例子:

1、数组:

int arr[5] = {1,2,3,4,5};

这就是最简单的数组,数组中每个元素都是int类型,下面的图片帮助大家很容易理解。

数组可以将相同类型的数据整合到一起,你可以通过下标的方式或者指针的方式来访问,在这里不多赘述。

2、指针数组:

int *parr1[10]

形如以上形式的,叫做指针数组,其中:paar1先与[10]结合为parr1[10],为一个有10个元素的数组,其次再与int*结合,及每个元素的类型是int*。以下图片更方便大家理解:

 注意:指针数组,本质上parr1是数组,因为优先级的关系,parr1先与[]结合,但是接下来要介绍的数组指针正好相反。

3、数组指针

int(*parr2)[10]

在第2点已经说过,数组指针因为()的缘故,优先级很高,所以parr2先与*结合为指针,并且是指向数组的指针,后面的[10]表示指向的数组里面有10个元素,每个元素为int型。下面的图更方便大家理解:

注意:此时的parr2是一个指针,如果把指针名parr2去掉,剩余的部分就是指针类型,:int(*)[10]

 这就是数组指针,其实并没有想象的那么神秘!


4、数组指针的应用

这里为大家分享一下数组指针的几个小应用。

  • 数组指针一般 = 右侧是整个数组的地址;
  • 当数组指针指向一维数组的时候(当然基本上没人这么用),形式如下:

int(*pa)[5] = &arr

注意:

  1. 这里pa是数组指针,指向数组中有5个元素,数组元素是int型。
  2. &+数组名就是整个数组的地址,其数值上虽然与首元素地址相同,但是意义完全不一样。
  3. pa指针指向的是整个数组的地址,那么*pa(将指针解引用)取出的是整个数组的地址(也是数组首元素的地址
  4. **pa取出的是第一个元素,与*pa[0]的效果等价。

  • 当数组指针指向二维数组中时,这个用法很常见,有些书上面称这种指针为行指针,顾名思义就是操纵一行的指针,形如:
void print_arr2(int(*arr)[5], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (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 };
	//数组名arr,表示首元素的地址
	//但是二维数组的首元素是二维数组的第一行
	//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
	//可以数组指针来接收
	print_arr2(arr, 3, 5);
	return 0;
}

运行结果: 

注意:

  1. 上述代码我们定义了一个3行5列的二维数组,需要注意的是,二维数组可以不写明行,但是必须写明列,这里我们用数组指针来接收,也必须注明是5列,这是为了告诉内存第二行在哪里开始存放
  2. 我们将arr数组名传参过去,在一维数组中arr数组名代表首元素的地址但在二维数组中arr数组名代码的是第一行的地址,所以这也是行指针的由来。
  3. 形参中的int(*arr)[5]中存放的是:二维数组第一行的地址,也就是说arr代表的是第一行的地址。
  4. *arr就是二维数组第一个元素的地址,本代码也就是1的地址;**arr才找到第一个元素,即1。
  5. (arr+1)是第二行的地址,*(arr+1)是第二行首元素的地址,*(*(arr+1))是第二行首元素,即6。

结语:

想必大家看过我的blog应该对数组指针与指针数组有了初步的了解

这也是我本人第一次写blog,还请各位大佬手下留情!

最后,放一道思考题:

请问以下代码代表什么意思:

int(*parr3[10])[5]


答案就是:

  • paar3是一个数组,数组中有10个元素,每个元素的类型是:int(*)[5];
  • paar3是存放数组指针的数组。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44580000/article/details/124259392

智能推荐

如何将手机变成一个(Linux)服务器_手机改服务器-程序员宅基地

文章浏览阅读2.2w次,点赞16次,收藏103次。看到就是赚到_手机改服务器

java double转String,去掉科学计数法_数值类型转成字符串后,不要用科学计数法-程序员宅基地

文章浏览阅读1.8k次。在数值型double转String格式时,如果同时遇到数值较大的double和小数位较多的double处理方法:double a = 123456789.10001;double b = 1.987654321;System.out.println("a: " + a);System.out.println("b: " + b);java.text.NumberFormat NF = java.text.NumberFormat.getInstance();//设置数值的小数部分所允许的最大._数值类型转成字符串后,不要用科学计数法

Fiddler抓包—手机app抓包_fiddler 移动端 app抓包-程序员宅基地

文章浏览阅读1.3k次。Fiddler抓包工作原理正常情况下,手机app是直接向服务器请求数据的,如果通过Fiddler抓包那么需要通过Fiddler,再向服务器请求数据。当app数据传到Fiddler,那么可以将请求的数据进行修改。比如app请求"123456",那么Fiddler可以将这一串数字改成"1",再发给服务器。此时服务器接收到的数据就是"1"。服务器返回数据到app和请求数据是一样的道理。Fid..._fiddler 移动端 app抓包

【200326】R语言read.table的用法以及报错line 6 did not have 15 elements 读取的项目数必需是列数的倍数-程序员宅基地

文章浏览阅读1.9w次,点赞10次,收藏32次。以2020美赛C题数据为例data <- read.table("D:\\mm\\Problem_C_Data\\hair_dryer.tsv" ,header = T, sep ="\t",dec = ".",quote="",comment.char = "",na.strings = c("NA"),fill=T)因为是tsv:Tab-separated values即制表符..._读取的项目数必需是列数的倍数

在使用Notepad++ WinSCP SFTP遇到的连接失败问题分析_如何使用notepad连接服务器一直失败-程序员宅基地

文章浏览阅读5.5k次。终于解决了一个困扰我几次的问题。在此经验分享一下,希望能帮到遇到同样问题的朋友。问题的起因是想使用Notepad++连接SFTP服务器,无法成功建立连接,总是停在通过验证后。Notepad++中的NppFTP插件一直显示”NppFTP - connecting“,无法取消,也不能进行其他操作。[NppFTP] Everything initializedConnecting_如何使用notepad连接服务器一直失败

python生成可视化操作界面,python怎么做可视化界面-程序员宅基地

文章浏览阅读969次,点赞10次,收藏27次。Python实战100例小伙伴们在学习Python的过程中,有时候不知道怎么学,从哪里开始学。掌握了一些基本的知识或者做了一些案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及源代码!下方名片自取即可,我都放在这里了。今天的分享就到这里结束辽~大家下次再见!

随便推点

解决ToolBox升级IDEA后导致之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)【修理篇】_toolbox 下载的ide没有copy之前的插件进来-程序员宅基地

文章浏览阅读2.5k次。【修理篇】ToolBox升级IDEA后之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)    在IDEA的插件配置地址都是可配置的,通过修改idea.properties可指定插件和logs的地址等这个配置文件地址在IDEA2020.1版本后出现了一些变化。如下:2020.1版本之前:配置文件地址在IDEA安装目录的bin目录下。2020.1版本之后:在此版本之后有两种方法。1.从C盘\User\Administrator里开始找AppData\Roaming\JetBra_toolbox 下载的ide没有copy之前的插件进来

File Monitor on WinRT-程序员宅基地

文章浏览阅读48次。http://lunarfrog.com/blog/filesystem-change-notifications Use CreateFileQueryWithOptions to add file monitor(win32 use file watcher).* By default it FolderDepth is Shallow(root folder only), D..._file monitor on window server

vue2 + electron 用超简单方法搭建前端桌面应用_vue 2.0 安装electron-程序员宅基地

文章浏览阅读564次。vue2 + electron 非常简单的搭建方法_vue 2.0 安装electron

【初学者】SVG图片加载失败,求解_解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)-程序员宅基地

文章浏览阅读2.6k次。最近在做期末作业,用Jekyll架站,前几天添加的svg图片还能加载,今天就不能了在hbuilder上是这样写的,前几天添加的svg图片还能加载,今天就不能了。用chrome检查是这样的请问应该怎么解决?..._解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)

html2canvas (踩坑) 网络图片显示不出来&生成图片只有一半或者空白&文字显示不出来问题处理_htm2canvas 图片只有左边一半-程序员宅基地

文章浏览阅读1.8w次,点赞7次,收藏13次。这里只提供解决思路,代码就不粘贴出来了图片显示不出来就像大多数人说的一样,HTML中的图片产生了跨域,可以将网络图片转为base64后修改img 的src属性值,添加图片允许跨域的属性。调用html2canvas的API时,将跨域参数设置为true,允许跨域。图片生成显示不全,只有半截或者空白在有滚动的页面,产生了滚动条后,生成的图片可能会只有一半或者空白。答案只有一个,那就是要把html2canvas的配置项参数中,scrollx,scrolly都设置为0,问题就解决了。     o゚*。o恭_htm2canvas 图片只有左边一半

PingOS服务器系统常见问题总结_exec_pull-程序员宅基地

文章浏览阅读2.4k次。转载请注明出处:https://blog.csdn.net/impingo我的开源项目地址:https://github.com/pingostack/pingos开源项目:https://pingos.io目录1. 如何支持H265编码?2. 如何降低直播延时?2.1 优化推流端2.2 优化PingOS服务器配置2.3 优化播放器端3. 如何降低HLS直播延时?4. 如何支持拉取rtsp源?QQ交流群:697773082本篇内容记录大家问的比较多的问题,持续更新…1. 如何支持H265编码?_exec_pull

推荐文章

热门文章

相关标签