19. C语言 -- 指针和二维数组

本文探讨C语言中的二维数组和指针的关系,详细解析了数组的三个关键问题:1) array表示数组首地址,尤其是对于二维数组,array是第一行的地址;2) *(array+1)表示第二行的第一个元素;3) * (*(array+1)+3)表示第二行的第四个元素。通过实例展示了数组下标和指针间接索引的等价性,并讨论了数组指针的概念。
摘要由CSDN通过智能技术生成

本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙

1. 二维数组

  回顾 《15. C语言 – 二维数组》 中的内容可以知道,C 语言没有真正意义上的二维数组。二维数组的实现,只是简单地通过“线性扩展”的方式进行。如图所示,int b[4][5]; 就是定义 4 个元素,每个元素都是一个包含 5 个整型变量的一维数组。它在内存中依然是以线性的形式存储。

在这里插入图片描述

2. 关于数组的三个问题

  假设我们定义了二维数组array[4][5],为了方便理解,使用如下的形式进行表述
在这里插入图片描述

2.1 array 表示的是什么?

  显然同一维数组一样, array 是整个二维数组的首地址;在一维数组中,数组名是数组中第一个元素的地址,但是在二维数组中,数组名是第一行元素的地址。其实这个也很好理解,可以将整个二维数组当作是一个一维数组,那么一维数组中的每一个元素就是 array 中的一行。下面将通过代码的形式进行验证

#include <stdio.h>

int main()
{
   
	int array[4][5] = {
   0};

	printf("sizeof int: %d\n", sizeof(int));
	printf("array: %p\n", array);
	printf("array + 1: %p\n", array + 1);

	return 0;
}

我们初始化了一个全为 0 的数组,首先打印出了整型在内存中的大小,之后打印出 array 的地址,和 array 的下一个位置的地址。如果 array 指向的是数组中的第一行,那么 array 将指向数组中的第二行,array 与 array 之间差就是 5*sizeof(int),也就是指针 array 的步长为 5 。执行上述代码可以得到如下的结果

sizeof int: 4
array: 0x7ffcebf6e700
array + 1: 0x7ffcebf6e714

  整型在内存中的大小为 4 ,而 array + 1 与 array 的差正好是 20。所以很明显,array 确实是数组中第一行元素的指针。

2.2 *(array+1)表示的是什么?

  *(array+1) 称为 (array+1) 的解引用,也就是之前所讲的取值。我们可以从两个角度对他进行理解。首先从解引用的角度,从上面你得分析可以知道,array 是数组中第一行元素的指针,也就是说 array 的地址是数组的首地址,步长是数组中每一行元素的个数。因此 array + 1 所表示的数组的第二行的指针,对它进行解引用,实际上就是对 array

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值