如果是 int float 等类型的不完全初始化,其余值默认为0。在这里插入图片描述

当不指定数组的大小时,初始化时有几个元素,数组就是多大,让我们用sizeof1关键字来看看下面数组大小

int main()
{
	int arr[] = { 1, 2, 3, 4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d ", sz);
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

运行结果:
在这里插入图片描述

下面是错误的初始化,程序报错
初始化元素个数要小于或等于数组大小

int arr[3] = { 1, 2, 3, 4 };
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
字符数组的初始化

  下面让我们看看以下两种不同的字符数组初始化

在这里插入图片描述

  运行结果:

在这里插入图片描述

  我们可以看到,arr1字符数组在打印时,除了a、b、c、d后还没结束,还打印了一些随机值,而arr2的打印是完全正常的,这是为什么呢。
  原来,字符串默认是有‘\0’作为结束标志,在第一种初始化方法中,输入的字符串后面是有一个不显示的‘\0’,数组知道什么时候结束,要取多大.
  而第二种在末尾的地方没有‘\0’字符作为结束标志,数组不知道什么时候停止。因此,这是一种错误的初始化方式。

  以下是arr2数组正确的初始化方式:

char arr2[] = { 'a','b','c','d','\0' };
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
(3)数组的类型

  数组也是有类型的,数组的类型算是一种自定义类型,去掉数组名留下的就是数组类型

如下:

int arr1[10];
int arr2[8];

char ch[5];
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

arr1数组的类型是int [10]
arr2数组的类型是int [8]
ch数组的类型是char [5]

注意:int、char是数组元素的类型,而不是数组的类型

2.2 数组的使用

(1)数组的下标

  我们了解了一维数组的基本语法,那么我们该如何使用一维数组呢?

  C语言规定数组是有下标的,下标从0开始的,假设数组有 n n n个元素,那么最后一个元素的下标就是 n − 1 n-1 n1

例如:

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
align="center"> class="table-box">
align="center"> 数组 align="center"> 1 align="center"> 2 align="center"> 3 align="center"> 4 align="center"> 5 align="center"> 6 align="center"> 7 align="center"> 8 align="center"> 9 align="center"> 10
align="center"> 下标 align="center"> 0 align="center"> 1 align="center"> 2 align="center"> 3 align="center"> 4 align="center"> 5 align="center"> 6 align="center"> 7 align="center"> 8 align="center"> 9

  C语言中数组访问提供了一个操作符[ ] ,这个操作符叫:下标引用操作符
  当我们想访问下标为7的元素时,可以使用arr[7],想访问下标为3的元素,就可以使用arr[3]

如下:

#include

int main()
{
	int arr[10] = { 1, 2, 3, 4 , 5 , 6, 7, 8, 9, 10 };
	printf("%d ", arr[7]);
	printf("%d ", arr[3]);
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述

(2)数组的输入与输出

  数组的输出与变量的输入差不多,只要我们产生数组的相应下标就可以啦,这时我们就需要使用到for循环

#include

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);//打印数组中的元素
	}
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

  输入也是同理

#include

int main()
{
	int arr[10];
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d", arr[i]);//循环向数组中输入元素
	}
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

  输出结果:
在这里插入图片描述

2.3 数组在内存中的存储

  前面我们知道了数组的基本知识,但要想更深入了解数组,那么了解它在内存中的存储必不可少。
  依次打印数组的地址和数组元素的地址:

#include

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	printf("   &arr = %p\n", &arr);//打印数组的地址
	printf("\n");
	for (i = 0; i < 10; i++)
		{
			printf("&arr[%d] = %p\n", i, &arr[i]);//打印数组中各个元素的地址
		}
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

  输出结果:

在这里插入图片描述

  我们可以看到,随着数组下标的增长,地址是从小到大变化的,且相邻两个下标之间相差 4(int类型是4个字节)。我们可以得出结论:数组在内存中是连续存放的。同时,我们还发现数组的地址和数组首元素地址相同,即&arr == &arr[0].

三、二维数组

3.1 数组的创建与初始化

  什么是二维数组呢,当我们把一维数组作为数组的元素,就是二维数组

(1) 数组的创建

  二维数组创建的语法如下:

type arr_name[常量值1][常量值2]

例如:
int arr[3][5];
double data[6][7];
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

二维数组的创建与一维数组类似
其中常量值1表示常量值2表示

(1) 数组的初始化

不完全初始化

int arr1[3][3] = {1, 2};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:

align="center"> class="table-box">
align="center"> 1 align="center"> 2 align="center"> 0
align="center"> 0 align="center"> 0 align="center"> 0
align="center"> 0 align="center"> 0 align="center"> 0

完全初始化

int arr2[3][3] = {1,2,3, 4,5,6, 7,8,9};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:

align="center"> class="table-box">
align="center"> 1 align="center"> 2 align="center"> 3
align="center"> 4 align="center"> 5 align="center"> 6
align="center"> 7 align="center"> 8 align="center"> 9

按行初始化

int arr3[3][3] = {{1,2},{3,4}};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:

align="center"> class="table-box">
align="center"> 1 align="center"> 2 align="center"> 0
align="center"> 3 align="center"> 4 align="center"> 0
align="center"> 0 align="center"> 0 align="center"> 0

二维数组可以省略行但不能省略列
当二维数组的第一行按指定格式被填满时,再从第二行开始填,填到几行数组就是几行

例如:

int arr4[][3] = {1,2,3,4,5,6,7};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:

align="center"> class="table-box">
align="center"> 1 align="center"> 2 align="center"> 3
align="center"> 4 align="center"> 5 align="center"> 6
align="center"> 7 align="center"> 0 align="center"> 0

例如:

int arr5[][3] = {{1,2}. {1.2}, {1,2}};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:

align="center"> class="table-box">
align="center"> 1 align="center"> 2 align="center"> 0
align="center"> 1 align="center"> 2 align="center"> 0
align="center"> 1 align="center"> 2 align="center"> 0

3.2 数组的使用

(1)数组的下标

二维数组与一维数组一样,访问也是使用下标形式,不同的是,二维数组有行和列,需要有两个下标
C语言中规定,二维数组的行是从0开始,列也是从0开始

例如:

int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

示意图:
在这里插入图片描述
代码演示:

#include

int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	printf("%d\n", arr[1][3]);
	printf("%d\n", arr[0][2]);
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

运行结果:

在这里插入图片描述

(2)数组的输入与输出

  与一维数组类似,想访问整个二维数组需要用到循环遍历所有下标,不同的是,二维数组需要用到循环的嵌套

代码如下:

#include

int main()
{
	int arr[3][5];
	int i = 0;//遍历行
	//输入
	for (i = 0; i < 3; i++)//产生行号
	{
		int j = 0;
		for (j = 0; j < 5; j++)//产生列号
		{
			scanf("%d", &arr[i][j]);//输入数据
		}
	}
	//输出
	for (i = 0; i < 3; i++)//产生行号
	{
		int j = 0;
		for (j = 0; j < 5; j++)//产生列号
		{
			printf("%d ", arr[i][j]);//输出数据
		}
		printf("\n");
	}
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

运行结果:

在这里插入图片描述

3.3 数组在内存中的存储

  像一维数组一样,如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。代码如下:

#include

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;
	int j = 0;
	printf("      &arr = %p\n", &arr);
	printf("\n");
	for (i = 0; i < 3; i++)
	{
		printf("   &arr[%d] = %p\n", i,  &arr[i]);
	}
	printf("\n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

运行结果:

在这里插入图片描述

从输出结果来看,不难看出:
1、 二维数组内,每一行内部的每个元素都是相邻的,地址之间相差4字节,跨行位置处的两个元素(如:arr[ 0 ][ 4 ]和arr[ 1 ][ 0 ])之间也是差4字节。所以二维数组中的每个元素都是连续存放的。
2、 数组的地址与数组首元素地址相同,数组每行地址与每行首元素地址相同

示意图:

在这里插入图片描述

四、变长数组

  在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组⼤⼩。

例如:

int arr1[10];
int arr2[3 + 5];
int arr3[]; = { 1, 2, 3 };
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

  但是这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够⽤,所以在C99中给⼀个变长数组(variable-length array,简称VLA)的新特性,允许我们可以使⽤变量指定数组⼤⼩。

代码如下:

#include

int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[n] = { 0 };
	return 0;
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

上面示例中,数组arr就是变长数组,因为它的长度取决于n的值,编译器无法事先确定,只有运行时才能知道n是多少。
同时,因为变长数组的长度只有运行时才能确定,所以变长数组的长度不能初始化
变长数组一旦创建,大小就无法改变(改变变量也不行)

  好啦,本期关于数组就介绍到这里啦,希望本期博客能对你有所帮助,同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!


  1. sizeof的解释
      sizeof是C语言中的一个关键字,可以计算类型或者变量所占用字节的大小,也可以用来计算数组的大小。
      我们知道数组所以元素的类型都是相同的,这时,我们可以用数组的总大小除以单个元素所占用的大小,就可以求出数组的元素个数了。 ↩︎

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/yusjushd/article/details/136095703","extend1":"pc","ab":"new"}">>
注:本文转载自blog.csdn.net的9毫米的幻想的文章"https://blog.csdn.net/yusjushd/article/details/136095703"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!