一维数组和二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一维数组和二维数组相关的知识,希望对你有一定的参考价值。

数组

一维数组的创建与初始化

数组的创建

数组的概念:一组具有相同类型元素的集合。 创建的方式:数组的元素类型 数组名称 指定数组的大小

例 : int arr[10]:创建了一个具有10个整形类型的数组。 char arr[10]:创建了一个包含有10个字符类型的数组; 方框内的数字必须是常量,不能是变量 例:

int n=0;
char arr[n]

这种写法是错误的;

数组的初始化

数组的初始化是指在创建数组的同时给数组的内容进行一些合理的初始化值。 例如:

int arr[10]=1,2,3,4,5,6;//不完全初始化,其余未进行初始化的4个元素为0;
int arr[4]=1,2,3,4//完全初始化。
char arr[10]=1,2,3,4//这是对字符型数组的不完全初始化,其余的6个元素默认为0;
char arr[4]=1,2,3,4//这是对字符型数组的完全初始化。
char arr[4]="1","2"//这种不完全初始化的方式也是允许的;这种一个一个赋值初始化的方式
//结尾没有\\0.
//另外,对于字符型数组的初始化还有其他方式,例如:
char arr[4]="ab";//这时前两个元素分别为a,b,后面的两个数字一个是由于字符窜结束放入
//的‘\\0,虽然其在监视中看到的依然是0,但他不是默认的0,最后一个数就是默认的0.

有时也可以不指定元素的个数,但是必须对数组即进行完全初始化,让系统自动的计算出语速的个数。 int arr[]=0; 这种写法是错误的,相当于既没有声明元素的个数,也没有进行初始化。 当然,也可以不给数组指定元素的个数,但必须进行数组的初始化,系统会自动计算元素的个数。由于字符窜总是以‘\\0’进行结尾,所以元素的个数总比输入字符的数目多一。 在计算字符窜的长度时,我们经常用到strlen和sizeof 这里要强调的是,sizeof计算的是数组空间的大小,他包含\\0,如果进行不完全初始化,用sizeof计算出的结果还是在初始化数组时[]中填入的数字。 另外,strlen函数计算的是\\0之前的字符窜的长度,就是我们能看到的字符的数量。计算时不包括\\0. 两者没有任何关系。 strlen:是求字符窜长度,只能针对字符窜长度,并且他是库函数,要应用头文件。 sizeof:计算变量,数组,类型的大小,单位是字节,他是一个操作符。 利用这个程序来测试一下自己是否理解

#include<stdio.h>
#include<string.h>
int main()

	char arr1[] =  a,b,c ;
	char arr2[] = "abc";
	printf("%d\\n", sizeof(arr1));
	printf("%d\\n", sizeof(arr2));
	printf("%d\\n", strlen(arr1));//这个不是字符窜,而strlen函数只针对\\0/之前的字符窜,运行给出的数字是一个随机值,
	printf("%d\\n", strlen(arr2));
	return 0;


数组的使用

[]:下标引用操作符,用来进行数组的访问。 数组的下标从0开始,依次往后增大。对数组的访问采用 数组名[下标];

#include<stdio.h>
int main()

	int arr[4] =  1,2,3,4 ;
	int a = arr[3];
	printf("%d\\n", a);
	return 0;


对整个数组进行打印,可以利用***循环***的方式

#include<stdio.h>
int main()

	int arr[4] =  1,2,3,4 ;
	for (int i = 0; i < 4; i++)
	
		printf("%d ", arr[i]);
	
	return 0;


#include<stdio.h>

int main()

	int arr[] =  1,2,3,4,5,6,7,8,9,0 ;
	int ch = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < ch; i++)
	
		printf("%d ", arr[i]);
	

	return 0;


数组是通过下标来访问的,下标是从0开始的; 数组的大小是可以通过计算得到的

数组在内存中的布局

我们用查看地址的方式来看一下数组在内存中是如何存放的;

#include<stdio.h>

int main()

	int* a;
	int arr[] =  1,2,3,4,5,6,7,8,9,0 ;
	int ch = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < ch; i++)
	
		a = &arr[i];
		printf("%p ", a);//打印地址用%p
	

	return 0;


可以发现,相邻两个地址之间差4; 表明 数组的存放方式是在内存中开辟一块空间,并把数字按顺序存放。

二维数组的创建与初始化

实际上,二维数组是一个平面的x-y坐标系。

二维数组的初始化

int arr[行][列] :几行几列的整形元素 int arr[3][4]:这代表一个3行4列的一个二维数组 int arr[3][4]=1,2,3,4,5,6,7 先从第一行开始排序,排完后从第二行的第一个元素继续排序。 int arr[3][4]=1,2,3,4,5,6,7 这样可以分别对每一行的数赋值到你想要的元素,其余未进行赋值的默认为0;上面的数组也同样; 还有一种省略行数的的初始化方式,这种方式必须进行完全初始化,这样系统会自动计算出行数。 int arr[][4]=1,2,3,4,5,6,7,8; 很明显,行数为3行。

二位数组的使用

对二位数组的使用仍然用下标来访问,。行和列都是从0开始的。

打印二维数组,采用双重循环的方式

#include<stdio.h>
int main()

	int arr[3][4] =  1,2,3,4,1,2,3 ;
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)//控制行数
	
		for (j = 0; j < 4; j++)//控制列数
		
			printf("%d ", arr[i][j]);
		
		printf("\\n");
	



###二位数组在内存中的存放方式

#include<stdio.h>
int main()

	int arr[4][3] =  1,2,3,4,5,6,7,8,9 ;
	int i = 0;
	int j = 0;
	for (i = 0; i < 4; i++)
	
		for (j = 0; j < 3; j++)
		
			int* a = &arr[i][j];
			printf("%p ", a);//%p用来打印地址。
		
	
		return 0;


发现相邻元素之间的地址是相差4个字节的,即使是上一行的最后一个元素与下一行的第一个元素也是一样的。也就是说,二维数组也是以像一维数组一样存放。

以上是关于一维数组和二维数组的主要内容,如果未能解决你的问题,请参考以下文章

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积,

一维数组与二维数组的拼接与二维数组增加行

C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

JS二维数组转一维数组

Python 创建一维数组二维数组和N维数组