C语言之简单理解数组

  • 数组是什么?----数组是一块空间内储存着一些相同类型的数据(相同类型的数据的集合),这些数据在这一块空间内分配的小空间都是有下标来标记的,方便查询等。
  • C语言中常见的数组维数一般为一维数组和二维数组

1、一维数组

(1)一维数组的创建

Ⅰ.创建方式: 数据类型 数组名 [数组大小] = {初始化列表};

  • 数据类型:是数组中所存的数据的类型,如int、double、char等。
  • 数组名:是数组的名字,命名要符合C语言标识符的命名规则(合法的标识符命名:①标识符由字母、下划线和数字组成;②第一个字符不能是数字,只能是下划线或者字母;③区分大小写,大写字母和小写字母不同即大小写的含义不同;④标识符的名称不能是C语言中的关键字,关键字是具有特定含义的标识符,用户只能根据系统的规定使用它们,如int是关键字,就不可以用来命名。)
  • 数组大小:是一个常量表达式,用来指定数组的大小。
  • {初始化列表}:可要可不要,详细见一维数组的初始化。
  • 注:[数组大小]:“[ ]”中要给常量(如5)或者常量表达式(如 5+1)才可以,不能使用变量。

Ⅱ.例:

  • int arr1[10];
  • char arr2[5+4];
  • int n = 10;
    int arr3[n];//不可以,因为n是变量,不是常量或者常量表达式。

(2)一维数组的初始化

Ⅰ.初始化:若在数组的创建时,我们想不指定数组大小就必须要初始化,数组元素的个数根据初始化的内容来确定的。
Ⅱ.例:

  • int arr1[ ] = {1, 2, 3, 4, 5};
  • int arr2[5] = {1, 2, 3, 4, 5};//也可以
  • char arr3[ ] = {‘a’, ‘b’, ‘c’};//该数组有3个元素‘a’, ‘b’, ‘c’
  • char arr4[ ] = “abc”;//该数组有4个元素,‘a’, ‘b’, ‘c’, ‘\n’
  • 注:像arr3和arr4如果按照字符串打印的话
    printf("%s\n", arr1);//输出abc
    printf("%s\n", arr2);//会一直不停地输出abc,因为字符串是以’\n’结束的,而arr4没有字符串结束标志。

(3)一维数组创建和初始化的使用

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int arr1[5];//数组的创建
   char arr2[] = {'s', 'h', 'e', 'e', 'n', 'a', '\0'};
   char arr3[] = "sheena";
   
   //输出数组的所有元素
   for(int i = 0; i < 5; ++i)//用for循环来访问数组中的所有元素。
   {
        arr1[i] = (i + 1);//i为数组一块空间给元素分配各自空间的下标。下标从0开始。
        printf("%d ", arr1[i]);//输出为1 2 3 4 5
   }
   printf("\n");
   
   printf("%s\n", arr2);//以字符串形式输出数组元素,结果为sheena
   printf("%s\n", arr3);//以字符串形式输出数组元素,结果为sheena
   
   int sz2 = sizeof(arr2) / sizeof(arr2[0]);
   int sz3 = sizeof(arr3) / sizeof(char);
   printf("%d\n", sz2);//结果为7
   printf("%d\n", sz3);//结果为7,字符串最后都有一个'\0'。


   system("pause");
   return 0;
}
  • 数组元素是使用下标来访问的,下标是从0开始的
  • 数组大小的计算方法: sizeof(arr) / sizeof(arr[0]);或sizeof(arr) / sizeof(数组类型);(求数组大小的方法,先记着。为什么这样,详细见C语言之简单理解指针和深入理解数组名

(4)一维数组在内存中存储的形式

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int arr1[5] = {1, 2, 3, 4, 5};
   
   for(int i = 0; i < 5; ++i)
   {
        printf("%p\n", &arr1[i]);//打印数组中每一个元素在内存中的空间的地址
   }
   
   system("pause");
   return 0;
}

在这里插入图片描述

  • 由上面显示的每个元素在内存中的空间的地址可得到,数组中每个元素地址空间大小相差为4个字节(刚好为数组中元素类型int的大小),故我们可知数组在内存中是一块连续的空间,数组是按照下标,由低到高依次存储的。
  • 如arr[0] ====> 0x 0001; arr[1] ====>0x 0002; arr[2] ====>0x 0003…

(5)一维数组的练习题

/*求一个一维数组arr[] = {12, 31, 500, 1, 34, 12, 60, 100}中的元素最大值,最小值,及所有元素的和
该题就是一个简单的一维数组的遍历。
*/
#include <stdio.h>

int main()
{
	int arr[] = { 12, 31, 500, 1, 34, 12, 60, 100 };
	int sz = sizeof(arr) / sizeof(int);
	int sum = 0;
	int max = arr[0];
	int min = arr[0];

	for (int i = 0; i < sz; ++i)
	{
		sum += arr[i];
		if(max < arr[i])
			max = arr[i];
		if (min > arr[i])
			min = arr[i];

	}
	printf("数组中元素的最大值为:%d\n", max);//结果为500
	printf("数组中元素的最小值为:%d\n", min);//结果为1
	printf("数组中的所有元素之和为:%d\n", sum);//结果为750

	return 0;
}

在这里插入图片描述

2、二维数组

  • 二维数组可以说是一维数组的数组,它的每一维存放的都是一个一维数组。也可以说是二维数组也算是一个一维数组。

(1)二维数组的创建
Ⅰ.创建方式:数据类型 数组名[常量表达式(行大小)][常量表达式(列大小)];

  • 规则和一维数组一样,唯一不同就是二维数组在创建时,数组大小分为行大小和列大小,故此时数组的大小为行大小乘以列大小。

Ⅱ.例:

  • int arr1[2][3];//两行三列
  • char arr2[3][4];//三行四列
  • double arr3[4][7];//四行七列

(2)二维数组的初始化
Ⅰ.初始化:若在数组的创建时,我们想不指定数组大小就必须要初始化,数组元素的个数根据初始化的内容来确定的。但是在二维数组初始化时,只可以省略行大小,但是不可以不写列元素。

Ⅱ.例:

  • int arr1[2][3] = {{1, 2, 3}, {4, 5, 6}};//{1, 2, 3}为第一行元素 {4, 5, 6}为第二行元素
  • int arr2[2][3] = {{1, 2}, {4}}//{1, 2}为第一行元素,{4}为第二行元素。但是当每一行元素初始化时没有填满,C语言自动填充为0。故该数组第一行元素为{1, 2, 0},第二行元素为{4, 0, 0}。
  • int arr3[2][3] = {1, 2, 3, 4};//也可以这样初始化化,此时元素不够的也自动填充为0,故该数组第一行元素为{1, 2, 3},第二行元素为{4, 0, 0}。
  • int arr4[][3] = {{1, 2}, {4}};//可以省略行大小,可以根据列大小推出行大小,故该数组为两行,第一行元素为{1, 2, 0},第二行元素为{4, 0, 0}。
  • int arr5[2][3] = {0};//该情况表示将数组中的所有元素都初始化为0,故该数组第一行元素为{0, 0, 0},第二行元素为{0, 0, 0}。

(3)二维数组创建和初始化的使用

#include <stdio.h>

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

	return 0;
}
  • 二维数组的大小的求法有两种:
    ①行大小乘列大小 row * column
    ②sizeof(arr) / sizeof(数组类型); 或sizeof(arr) / sizeof(arr[0][0]);

在这里插入图片描述

(4)二维数组在内存中存储的形式

#include <stdio.h>
#include <stdlib.h>

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

	return 0;
}

在这里插入图片描述

  • 由上图可知二维数组在内存中的存储和一维数组是一样的,也是一块连续的空间。数组是按照下标,由低到高依次存储的。
  • 在这个层面上说,其实二维数组在内存中就是一维数组,只不过我们可以把它按照二维数组的形式输出显示在我们眼前。

()二维数组的练习题

//求一个二维数组arr[2][3] = {66, 77, 33, 44, 55, 10}中的元素最大值,最小值,及所有元素的和
#include <stdio.h>

int main()
{
	int arr[2][3] = {66, 77, 33, 44, 55, 10};
	int sum = 0;
	int max = arr[0][0];
	int min = arr[0][0];
	int sz = sizeof(arr) / sizeof(int);//求二维数组大小
	int row = sz / 3;//二维数组大小为行大小乘列大小

	for (int i = 0; i < row ; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			sum += arr[i][j];
			if (max < arr[i][j])
				max = arr[i][j];
			if (min > arr[i][j])
				min = arr[i][j];
		}
	}
	printf("数组中元素的最大值为:%d\n", max);//结果为77
	printf("数组中元素的最小值为:%d\n", min);//结果为10
	printf("数组中的所有元素之和为:%d\n", sum);//结果为285

	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值