首页 > 编程语言 >C/C++:探究二维数组的数组名

C/C++:探究二维数组的数组名

时间:2022-11-11 09:00:30浏览次数:65  
标签:int 二维 C++ 数组名 数组 array ptrToArray 指针

C/C++:探究二维数组的数组名与数组指针

先提一嘴:一维数组的数组名

对于一个一维数组而言,其数组名是该数组的首地址,也就是一个数组首元素的指针,如下:

#include<stdio.h>

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

    printf("array: %p, &array[0]: %p\n", array, &array[0]);

    return 0;
}

可以发现二者等价

img

正题:二维数组的数组名的意义是何?

先抛结论:二维数组的数组名是一个数组指针

二维数组的数组名是一个数组指针

假设有一个二维数组array[5][5],那么数组名array相当于一个数组指针ptrToArray,我们先看看怎么声明一个数组指针。

//该指针变量指向一个一维数组
int (*ptrToArray)[5]

二维数组名的运算

我们知道:对数组指针变量ptrToArray进行增减运算,跨越的地址为5int的地址,二维数组的数组名也是如此。

/**
探究二维函数的数组名的意义
*/
#include<stdio.h>

int main()
{
	int array[5][5] = {
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15},
		{16,17,18,19,20},
		{21,22,23,24,25}
	};
	//以地址的格式输出数组名,以及与循环变量的和
	/*
		array + 0: 0061FEA8
		array + 1: 0061FEBC
		array + 2: 0061FED0
		array + 3: 0061FEE4
		array + 4: 0061FEF8
	*/
	printf("the address of \"array\": %p\n", array);
	for(int i = 0; i < 5; i ++)
	{
		printf("array + %d: %p\n", i, array + i);
	}

	//对数组名进行解引用并输出
	//the val of "*array": 6422184
	//显然这不是数组中某个元素的值,所以*array应该是一个指针
	printf("the val of \"*array\": %d\n", *array);

	//以地址格式输出*array
	//the adress of "*array": 0061FEA8
	printf("the adress of \"*array\": %p\n", *array);
	for(int i = 0; i < 5; i ++)
	{
		printf("*array + %d: %p\n", i, *array + i);
	}

	return 0;
}

img

对比数组指针的运算

#include<stdio.h>

int main()
{
	int array[5][5] = {
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15},
		{16,17,18,19,20},
		{21,22,23,24,25}
	};
	int (*ptrToArray)[5] = array;
	//以地址的格式输出数组指针,以及与循环变量的和
	/*
		ptrToArray + 0: 0061FEA8
		ptrToArray + 1: 0061FEBC
		ptrToArray + 2: 0061FED0
		ptrToArray + 3: 0061FEE4
		ptrToArray + 4: 0061FEF8
	*/
	printf("the address of \"ptrToArray\": %p\n", ptrToArray);
	for(int i = 0; i < 5; i ++)
	{
		printf("ptrToArray + %d: %p\n", i, ptrToArray + i);
	}

	//对数组指针进行解引用并输出
	//the val of "*ptrToArray: 6422184
	printf("the val of \"*ptrToArray\": %d\n", *ptrToArray);

	//以地址格式输出*ptrToArray
	//the adress of "*ptrToArray": 0061FEA8
	printf("the adress of \"*ptrToArray\": %p\n", *ptrToArray);
	for(int i = 0; i < 5; i ++)
	{
		printf("*ptrToArray + %d: %p\n", i, *ptrToArray + i);
	}
	

	return 0;
}

img

可以发现,arrayarray + 1相差了20个字节,即5int的宽度,而*array*array + 1相差了4个字节,即1int宽度。

总结

通过这些特征,不难发现二维数组的数组名其实等价于数组指针,指向第一个一维数组,对其增减可使其指向其他一维数组; 对数组名的解引用进行增减,可以使其指向一维数组中的各个元素

其实三维数组的数组名也是一个数组指针,不过是一个指向二维数组的指针,感兴趣可以看看这篇博客:
C语言之三维数组

标签:int,二维,C++,数组名,数组,array,ptrToArray,指针
From: https://www.cnblogs.com/yousa/p/16879488.html

相关文章

  • C++ __autoclassinit2
    环境:VS2022 Version17.4.0操作系统:Windows10EnterpriseLTSC 19044.2193今天在写一个类的时候调试偶然看到__autoclassinit2这个东西发现一旦类中定义有指针变......
  • C++ 11新特性:类模板 ----- 元组tuple
    C++11标准新引入了一种类模板,命名为tuple(中文可直译为元组)。tuple最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple的应用场景很广泛,例如当需要存储......
  • C++标准库<locale> :由islower() 函数 ----- 判断字符是否为小写字母 深入学习locale库
      C++标准库<locale>:声明:classlocale;接口:   ......
  • 模板和泛型编程 C++ primer笔记
    16.1定义模板重载多个相似的函数是麻烦的:比如重载能接受多个类型的compare。使用函数模板之后可以定义成这样:template<typenameT>intcompare(constT&v1,constT......
  • C++ 输出 控制小数位数
    头文件:#include<iomanip>按有效位输出是setprecision,按小数位数输出也是setprecision,但到底是谁取决于fixed。cout<<resetiosflags(ios::fixed)<<setprecision(n)......
  • C++ 获取目录下所有文件的文件名
    vector<string>getFiles(stringcate_dir){vector<string>files;//存放文件名#ifdefWIN32_finddata_tfile;longlf;//输入文件夹路径if......
  • C++中fopen的句柄返回NULL
    我们在使用fopen打开文件的时候有时会出现失败返回null情况,但是我们不能直接通过log具体是什么原因导致的,所以这时我们可以通过errno和strerror获取错误码和错误信息。我......
  • C++编程笔记(GPU并行编程)
    目录一、配置并使用二、代码一、配置并使用环境:Windows10+CLion+VS2019cuda的安装,并行的话只需要安装cuda,cuDNN就不必了编译器设置,windows下建议使用MSVC,因为是官......
  • C++ 之string类常用接口功能解析(7千字长文带你玩懂string!)
    C++之string常用接口功能解析关于string的背景我们可以看到string的本质就是一个类模板!**为什么使用的是类模板因为字符串涉及到了编码的问题!——有ACCII,utf-8utf-1......
  • C++软件编码规范推荐--文件结构
    1文件结构每个C/C++程序通常分为两个文件,头文件(保存程序的声明)和定义文件(保持程序的实现)。头文件以“.h”为后缀;C程序的定义文件以“.c”为后缀,C++程序的定义文......