C语言数组

本文详细介绍了C语言中一维和二维数组的概念、创建方式、初始化、下标使用、元素存储以及内存结构,并通过示例和练习题帮助读者掌握数组的基础知识。
摘要由CSDN通过智能技术生成

数组就是相同类型元素的集合

  • 数组可以存放一个值或多个值,但是数组元素个数不能为0
  • 数组存放的数据类型必须是相同的

一维数组

1.一维数组的创建

基本语法如下:
type arr_name[元素个数];,比如:

int arr[5];//创建一个整型数组,该数组有5个值

存放在数组中的值为称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型

  • type:数组的元素类型,比如int,char,double……
  • arr_name:数组的名字,起名随自己,需要取得有意义
  • 元素个数:指的是数组中存放的元素个数,是来指定数组大小的

2.一维数组的初始化

有时候创建数组需要直接在数组中存放值,所以给定初始值,就叫做初始化
数组的初始化一般使用大括号,将数据括在大括号里

//完全初始化
int arr1[3] = {1,2,3};
//不完全初始化
int arr2[4] = {1,2};
//错误的初始化,初始化值太多
int arr3[3] = {1,2,3,4};

3.数组的类型

数组的类型区别与元素的类型,是一个全新的概念,比如 int a = 3;int就是a的数据类型,但是int arr[3]={1,2,3};它的数组的类型就是:int [3]。即:
去掉数组名,去掉初始化值,剩下的部分为数组的类型

4.一维数组的使用

4.1.数组下标

C语言规定数组是有下标的,且下标从0开始计数,也就说假如有n个元素,那么最后一个元素的下标就是n-1,下标相当于数组元素的编号,比如:

int arr[5] = {1,2,3,4,5};

那么:
在这里插入图片描述

在C语言中数组的访问提供了一个操作符:[ ] ,叫做:下标引用操作符
有了下标引用操作符,就可以轻松的访问数组中的元素的,比如要查找下标为3的元素就可以写为arr[3],比如:

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

4.2.数组元素的打印

只要依次产生所有元素的下标,就可以用打印所有的数组元素,所以可以使用for来完成:

int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);//打印1 2 3 4 5 6 7 8 9 10
	}
	return 0;
}

在这里插入图片描述

4.3.数组元素的输入

既然可以使用for循环来实现数组元素的打印,那么也可以使用循环来完成数组元素的输入:

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

在这里插入图片描述

5.一维数组在内存中的存储

依次打印数组元素的地址:

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


这是16进制数,每个地址之间相差4个字节,因为int类型占4个字节,所以:
数组元素在内存中的存储时连续存放的

6.sizeof计算元素的个数

在遍历数组时我们想知道数组中元素的个数,就可以使用sizeof
sizeof时C语言中的一个关键字,是可以计算类型或者变量的大小的,单位是字节 sizeof也可以计算数组的大小

int main() {
	int arr[10] = { 0 };
	printf("%zd\n" ,sizeof(arr));
	return 0;
}

在这里插入图片描述

该数组的大小为:40字节,这是因为有10个int类型的元素,而int类型的大小为4字节,所以大小为4*10=10.
然后我们可以计算一个数组元素的大小:

int main() {
	int arr[10] = { 0 };
	printf("%zd\n" ,sizeof(arr[0]));
	return 0;
}

在这里插入图片描述

所以可以用总的元素的大小除以一个元素的大小就可以得到元素的个数了。

int main() {
	int arr[10] = { 0 };
	printf("%zd\n" ,sizeof(arr)/sizeof(arr[0]));
	return 0;
}

在这里插入图片描述

即:
在这里插入图片描述

二维数组

一维数组是相同元素的集合,而二维数组就是一维数组的集合,二维数组以上的数组称为多为数组

7.二维数组的创建

创建形式:
type arr_name[行数][列数]
比如:

int arr[2][3];//创建了一个2行3列的二维数组

8.二维数组的初始化

二维数组的初始化与一维数组的初始化大同小异

//完全初始化
int arr1[2][3] = {1,2,3,4,5,6);
//不完全初始化
int arr2[2][3] = (1,2,3};
//错误初始化,超出限制
int arr3[2][3] = {1,1,1,1,1,1,1,1,1,1,1,1};
//按照行初始化
int arr4[2][3] = {{1,2,3}{1,1,1}};
  • 完全初始化:int arr1[2][3] = {1,2,3,4,5,6);
    在这里插入图片描述
  • 不完全初始化:int arr2[2][3] = (1,2,3};
    在这里插入图片描述
    初始化时可以省略行,但是不能省略列
    因为如果省略列的话,就不知道一行有几个元素了

9.二维数组的使用

9.1.二维数组的下标

二维数组也是由下标来访问的,它是有行和列的,其也是从0开始,如果有n行m列,那么末尾数组元素的下标为:n*m-1.
初始化的时候第一行元素放满了就会放第二行。

int main() {
	int arr[2][3] = { 1,2,3,2,3,4 };
	printf("%d", arr[1][2]);//使用下标查找
	return 0;
}

在这里插入图片描述
在这里插入图片描述

9.2.二维数组的输入与输出

运用循环的嵌套,先循环打印出行,在打印第一行的时候循环打印列,如此循环就可以完成二维数组的输入与输出

int main() {
	int arr[3][4];
	for (int i = 0; i < 3; i++) {//产生行号
		for (int j = 0; j < 4; j++) {//产生列号
			scanf("%d", &arr[i][j]);//输入
		}
	}
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

在这里插入图片描述

10.二维数组在内存中的存储

二维数组在内存中的存储像一维数组一样,也是每个元素连续存放

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

在这里插入图片描述
即:
在这里插入图片描述

数组练习题

数组是一个比较简单的知识,但是其中也有相对较难理解的点,下面看看这两道题目,可以巩固学到的知识。
多个字符从两端移动,向中间汇聚
二分查找

/考研势在必行/
  • 78
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值