C语言数组---看这里就够了

C语言数组---看这里就够了,第1张

C语言数组
  • 一、什么是数组
  • 二、一维数组
    • ① 一维数组的使用
  • 三、二维数组
    • ① 二维数组的使用
  • 四、数组在内存中的存储
  • 五、数组越界
  • 六、数组与指针
  • 七、结尾

一、什么是数组

数组(Array)是一种存储同一类型的集合,是一种有序的线性结构表,而且数组元素的地址是连续的。

数组的最大优点是可以随机访问:当你想访问数组的某个数时,只需要找到数组对应的下标就可以找到该数组对应的元素。
同时数组也是有缺点的:数组在创建的时候,数组元素的个数和数组空间大小是被固定死的,当数组空间没有被使用完的时候,会造成空间浪费。
数组的下标:
数组的下标是从0开始,假如你需要访问第三个元素时,数组应该是arr[2]。访问arr[0]时,才为第一个元素。

二、一维数组

一维数组最常见的创建为:数据类型 + 数组名 [ 元素个数 ];
在数组创建的时候,[ ]中需要一个常量,不能使用变量。

int arr[5];
double arr[8];
float arr[10];
char arr[25];

一维数组的初始化:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};	//整形数组
int arr[] = {0};	//不指定大小但必须初始化
char ch[10] = {'1','2','3'};	//字符数组
char str[10] = "abcde";		//字符串数组
① 一维数组的使用
#include

int main()
{
	int arr[5]={3,2,1,9,9};
	
	printf("%d",arr[0]);//访问第一个元素
	
	return 0;
}


数组的输入与输出:

#include

int main()
{
	int arr[5]={0};//数组初始化
	int i = 0;
	
	for(i=0;i<5;i++)//for循环输入
	{
		scanf("%d",&arr[i]);
	}
	
	for(i=0;i<5;i++)//for循环输出
	{
	printf("%d ",arr[i]);	
	}
	
	return 0;
}

三、二维数组

二维数组在逻辑概念中可以为一个矩阵,但在内存中与一维数组一样是一个连续的地址空间。
二维数组的创建为:数据类型 + 数组名 [元素个数] [元素个数];

int arr[3][4];//第一个[行数] [列数]
char arr[][5];//可以不初始化行,必须初始化列
double arr[2][4];

二维数组的初始化:

int arr[3][3] = {1,2,3,4};//4自动保存在arr[1][0]的位置
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}//里面一个大括号代表一行
① 二维数组的使用
#include

int main()
{
	int arr[3][4] = {0};
	int i = 0;
	int j = 0;
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("arr[%d][%d] = %d\n" ,i,j,arr[i][j]);
		}
	}
	return 0;
 } 


二维数组是使用双重嵌套进行输入与输出。

四、数组在内存中的存储

一维数组代码:

#include

int main()
{
	int arr[5]={1,2,3,4,5};
	
	printf("%p\n",&arr[0]);
	printf("%p\n",&arr[1]);
	printf("%p\n",&arr[2]);
	printf("%p\n",&arr[3]);
	printf("%p\n",&arr[4]);
	
	return 0;
}


二维数组代码:

#include

int main()
{
	int arr[3][4] = {0};
	int i = 0;
	int j = 0;
	
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("arr[%d][%d] = %p\n" ,i,j,&arr[i][j]);
		}
	}
	return 0;
 } 


一维数组在内存中的存储方式:
一维数组的元素地址是连续的,也就是元素的地址一个紧挨着一个。地址在内存是以二进制进行存储的,但是如果以二进制来展示的话就会非常的长而且也未必好理解,所以就由十六进制来进行展示。可以看到地址是有规律的增长的,每个数组元素地址都相差了四个字节,每四个字节是一个int整型的空间大小。
*二维数组在内存的空间布局上,也是线性连续且递增的。
*二维数组本质上也是一维数组,只不过内部元素放的是一堆数组。

五、数组越界

数组的下标范围是有限的,因为数组的下标是由0开始的,所以数组能访问的的下标就是数组元素个数减一个(N-1),当访问了不属于数组元素地址范围的空间,就叫做数组越界。
假设一个arr[10]的数组,当访问下标时大于等于10的时候,就会导致数组向后溢出,也叫下溢出。
相对的,当数组向数组第一个元素的前面越界访问时,也就是下标小于0,就叫上溢出。
越界访问是非常危险的一个 *** 作,因为有的编译器没有检查数组是否越界的功能,所以,当程序员在写代码所以数组时,要非常注意数组是否存在越界问题。二维数组的行和列也同样。
代码:

#include

int main()
{
	int arr[5]={1,0,3,4,5};
	
	printf("%d\n",arr[5]);
	
	return 0;
}


注意:结果中的0非数组arr[1]处的0元素,而是越界下溢出!!!
在访问数组的时候一定要主意越界问题。

六、数组与指针

(1)指针数组:实际是一个数组,数组的每个元素存放的是一个指针类型的元素。

  1. int *arr[10];
  2. //优先级问题:[ ]的优先级比*高
  3. //说明arr是一个数组,而int*是数组里面的内容
  4. //上式的意思就是:arr是一个含有8个int*的数组

(2)数组指针:实际是一个指针,该指针指向数组。

  1. int (*arr)[8];
  2. //优先级问题:[ ]的优先级比*高,在写数组指针的时候必须将 *arr用括号括起来
  3. //arr先与* 结合,说明p是一个指针变量
  4. //上式的意思就是:指针arr指向一个大小为8个整型的数组
七、结尾

数组其实不只有一维和二维数组,还有三维数组甚至更高维,但是在情况下很少会用到,而且对于初学者用到二维数组就已经足以。
如果有问题欢迎在评论区留言讨论

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1329764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存