深入理解一维数组与二维数组(代码片段)

TangguTae TangguTae     2023-01-12     380

关键词:

一维数组与二维数组的传参

接收一维数组的形参有三种形式

void fuc1(int *arr)

void fuc2(int arr[])

void fuc3(int arr[5])

int main()

	int* arr1[5] = 0;
	fuc1(arr1);
	fuc2(arr1);
	fuc3(arr1);
	return 0;

可以用指针来作为形参(常用的方法),也可以用arr[]或者arr[数组长度]来接收数组。实际上一维数组的传参还需要给出数组长度,不然无法确定数组大小是多少。

void fuc4(int* arr[5])

void fuc5(int* *arr)

int main()

	int* arr2[5] =  NULL ;
	fuc4(arr2);
	fuc5(arr2);
	return 0;

对于这种指针数组,int* arr[5]表示我需要接收指针数组,fuc5的形参为什么可以写成int* *arr呢?原因是 *arr表示接收的是一个指针,int*表示该数组里面存放的是地址,所以说地址的地址就用二级指针来作为形参。

对于指针数组不了解的可以参考详解指针数组、数组指针、函数指针_TangguTae的博客-CSDN博客https://blog.csdn.net/weixin_43164548/article/details/119788774?spm=1001.2014.3001.5501

二维数组的传参相比较一维数组的传参要复杂一点

常见的传参形式

void fuc1(int arr[3][9])

void fuc2(int arr[][9])

void fuc3(int (*arr)[9])


int main()

	int arr[3][9] =  0 ;
	fuc1(arr);
	fuc2(arr);
	fuc3(arr);
	return 0;

解释:fuc1二维数组怎么定义的他就怎么写,相对于fuc1,fuc2省略了行,C语言是允许的,但是如果是省略了列,就是错误的写法,例如arr[3][ ]或者arr[ ][ ]。实参传递的是数组名,二维数组的数组名是第一行的地址,所以说,要接收arr就得使用数组指针,所以fuc3的形参就是数组指针。很多初学者可能会传二级指针,int** arr,这样也是错误的,fuc3成立二级指针就不成立。

一维数组的深入理解

int main()

	int arr[] =  1,2,3,4 ;
	printf("%d\\n", sizeof(arr));//16
	printf("%d\\n", sizeof(arr + 0));//4
	printf("%d\\n", sizeof(*arr));//4
	printf("%d\\n", sizeof(arr + 1));//4
	printf("%d\\n", sizeof(arr[1]));//4
	printf("%d\\n", sizeof(&arr));//4
	printf("%d\\n", sizeof(*&arr));//16
	printf("%d\\n", sizeof(&arr + 1));//4
	printf("%d\\n", sizeof(&arr[0]));//4
	printf("%d\\n", sizeof(&arr[0] + 1));//4
	return 0;

以上结果都是在32位环境下运行得到

解释:arr是一维数组数组名,sizeof(arr)计算的是一维数组的总大小,arr+0表示的是首元素的地址,sizeof(arr)计算的是地址的大小;*arr表示数组的首元素;arr+1是数组中第二个元素的地址;arr[1]是数组中的第二个元素;&arr是整个数组的地址;*&arr取地址与解引用相互抵消,得到的是数组名;&arr+1跳跃了整个数组,任然是个地址;&arr[0]和arr+0一样,首元素地址;&arr[0]+1第二个元素的地址。

字符串数组

int main()

	char c[] =  'a','b', 'c', 'd', 'e', 'f' ;

	printf("%d\\n", strlen(c));
	printf("%d\\n", strlen(c+0));
	printf("%d\\n", strlen(&c));
	printf("%d\\n", strlen(&c+1));
	printf("%d\\n", strlen(&c[0]+1));
	return 0;

以上结果都是随机值。

其中一个原因是末尾没有'\\0',strlen是遇到'\\0'才结束计算字符串的长度。&c作为实参会报警告,与strlen的形参const char*不匹配,所以也会出现随机值。

C语言常用字符串函数详解_TangguTae的博客-CSDN博客_c字符串函数https://blog.csdn.net/weixin_43164548/article/details/119982673?spm=1001.2014.3001.5501

二维数组的深入理解

int main()

	int arr[3][4] = 0;

	printf("%d\\n", sizeof(arr));//48
	printf("%d\\n", sizeof(arr[0][0]));//4
	printf("%d\\n", sizeof(arr[0]));//16
	printf("%d\\n", sizeof(arr[0]+1));//4
	printf("%d\\n", sizeof(*(arr[0]+1)));//4
	printf("%d\\n", sizeof(arr+1));//4
	printf("%d\\n", sizeof(*(arr+1)));//16
	printf("%d\\n", sizeof(&arr[0]+1));//4
	printf("%d\\n", sizeof(*(&arr[0] + 1)));//16
	printf("%d\\n", sizeof(*arr));//16
	return 0;

以上结果都是在32位环境下运行得到

解释:arr是二维数组的数组名,也是第一行的地址,所以sizeof(数组名)为整个数组的大小即3*4*4=48;arr[0][0]第一行的第一个元素,int类型;arr[0]是二维数组第一行的数组名,也是首元素地址,同样sizeof(数组名)为第二行的大小即16;arr[0]+1为第一行第二个元素的地址;*(arr[0]+1)为第一行第二个元素;arr+1位第二行数组的地址;*(arr+1)为第二行的数组名,也是第二行首元素地址,sizeof(数组名)为第二行的大小即16;&arr[0]+1,&arr[0]第一行的地址,+1变为第二行的地址,*(&arr[0] + 1),第二行数组名、首元素地址;*arr第一行的首元素地址、数组名。

数组-二维数组(代码片段)

一、如何理解二维数组数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则此数组A称为二维数组二、二维数组的声明与初始化正确的方式://二维数组的声明和初始化in... 查看详情

10-二维数组(代码片段)

1.如何理解二维数组?数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则,此数组A称为二维数组。2.二维数组的声明与初始化1//正确的方式:2int[]arr=newint[]1,2,3;//一维... 查看详情

一维数组和二维数组(代码片段)

数组一维数组的创建与初始化数组的创建数组的概念:一组具有相同类型元素的集合。创建的方式:数组的元素类型数组名称指定数组的大小例:intarr[10]:创建了一个具有10个整形类型的数组。chararr[10]:创建了一个包含有10个字... 查看详情

对于pytorch中dim=1的理解(代码片段)

目 录1理解shape2理解dim3理解模型预测中的dim1理解shape对于python中shape的理解:(1,2)表示1个一维数组,每个一维数组长度为2;(1,2,3)表示1个二维数组,每个二维数组有2个一维数组,每个一维数组长度为3;(1,2... 查看详情

numpy一维数组二维数组与pandas的seriesdataframe行列结构和横纵方向的统一说明(代码片段)

最近在这个问题上耽误了一些时间,原因是之前个人理解上出了一些偏差,又受到错误文章的误导,把这个问题搞复杂了,现在统一梳理一下。在展开之前,先明确说明的是:NumPy的二维数组与Pandas的DataFra... 查看详情

碎碎念(代码片段)

...针数组3.数组指针4.二维数组5.二维数组是线性存储的(用一维数组方式打印)6.一维(二维)数组与数组指针7.二维数组做函数参数8.sizeof测试一维数组、二维数组1.typedef定义数组类型有typedef是类型,没有是变量typdefintA[8];=====typdefin... 查看详情

数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例(代码片段)

一、题目要求给你一个数组nums,数组「动态和」的计算公式为:runningSum[i]=sum(nums[0]…nums[I]),请返回nums的动态和。示例1:输入:nums=[1,2,3,4]输出:[1,3,6,10]解释:动态和计算过程为 查看详情

数据结构与算法之深入解析“一维数组的动态和”的求解思路与算法示例(代码片段)

一、题目要求给你一个数组nums,数组「动态和」的计算公式为:runningSum[i]=sum(nums[0]…nums[I]),请返回nums的动态和。示例1:输入:nums=[1,2,3,4]输出:[1,3,6,10]解释:动态和计算过程为 查看详情

numpy学习二:数组的索引与切片(代码片段)

...(索引值)是1,第二维脚标(索引值)是3的元素,可以理解为获取二维数组中第2行第4列的元素arr2d[1,3]结果:8#二维数组切片多维数组可以按照维度分为多个轴,以二维数组为例,第一维可以用第0轴“axis=0”表示,第二维可以... 查看详情

指针与一维数组和二维数组以及字符串指针数组的学习笔记

...多少,直接上代码,关键的东西已经注释了,看注释信息理解即可。说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简... 查看详情

c语言数组(一维数组形参退化|二维数组形参退化|函数形参等价关系)(代码片段)

文章目录一、一维数组形参退化二、二维数组形参退化三、数组形参等价关系一、一维数组形参退化C中将一维数组作为参数,传递到函数中,该一维数组会退化为指针;将intarray[10]数组,作为参数,传递到函数中,voidfun(intarray[1000])与voi... 查看详情

0511二维数组定义(代码片段)

二维数组数组的数组---二维数组的每一个元素是一个一维数组定义格式数据类型[][]数组名=new数据类型[二维数组的长度/包含的一维数组的个数][每个一维数组的长度];int[][]arr=newint[3][5];---定义了一个整型的二维数组,其中包含3个... 查看详情

c语言进阶笔记深入了解进阶指针(代码片段)

目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

c语言进阶笔记深入了解进阶指针(代码片段)

目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

多维数组与指针(代码片段)

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念和使用上,多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11... 查看详情

java数组2----二维数组(代码片段)

...用概念可以将二维数组想象为一张表。表的每一行是一个一维数组。那么二维数组就可以看作元素是一维数组的数组。对二维数组的访问也是通过索引实现,只不过需要两个索引如下表示的二维数组,需要找到23就需要索... 查看详情

深入理解指针与数组(代码片段)

...时隔许久又一良心巨著,主要是介绍了指针和数组的一些深入的理解,特意整理出来一篇博客供我们一起学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步!文章目录一:指针1.1什么是指针1.2... 查看详情

vue二维数组合并一维数组(代码片段)

vue二维数组合并一维数组原理:先将二维数组转成一维数组,然后和一维数组进行合并,合并之后再转成二维数组。//在当前页先引入chunk方法不用下载自带的importchunkfrom'lodash/chunk'letarr1=[118.02,24.48];letarr2=[... 查看详情