【C】数组(array)

数组(array)

数组的概念

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

  • 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
  • 数组中存放的多个数据,类型是相同

数组分为一维数组多维数组 ,多维数组一般比较多见的是二维数组

一维数组的创建和初始化

数组创建

一维数组

c 复制代码
type arr_name[常量值];//arr_name数组名,可自定义
                      //type 数组元素的类型
                      //[]中的常量值是用来指定数组的大小的

例:

c 复制代码
int arr[5];//整数类型,存放五个元素
float arr2[7];//浮点型,存放七个元素
char arr3[3];//字符型,存放三个元素

数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值 ,这种就称为初始化

数组的初始化一般使用大括号,将数据放在大括号中

c 复制代码
 //完全初始化
 int arr[5]={1, 2,3,4,5};
//不完全初始化
 int arr2[5]= {1};//第一个元素初始化为1,剩余的元素默认初始化为0
 int arr3[5]={0};
 //错误的初始化-初始化项太多
int arr4[3]={1,2,3,4};

数组一旦有初始化的时候,数组的大小可以省略

c 复制代码
int arr[5] = { 1,2,3,4,5 };
int arr[] = { 1,2,3,4,5 };//根据初始化的内容来确定元素个数

这时,二者是一样的

但是:

c 复制代码
int arr[5] = { 0 };//含有五个元素且元素全为0
int arr[] = { 0 };//含有一个元素,为0

这两个数组含义是完全不同的

数组的类型

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

c 复制代码
int arr1[10];//int 为数组元素的类型,arr1数组的类型是 int[10] 
int arr2[12];//int 为数组元素的类型,arr2数组的类型是 int[12] 
char ch[5];//char 为数组元素的类型,ch数组的类型是 char[5]

注:

c 复制代码
int main() {
	int a = 10;
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof(int));
	return 0;
}

此时输出都为4,说明用类型和用变量的结果是一样的

此时,推及到数组上:

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

此时的输出都为40

一维数组的使用

数组下标

规定数组下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:

c 复制代码
 int arr[10]={1,2,3,4,5,6,7,8,9,10};

数组的访问提供了一个操作符[ ],这个操作符叫:下标访问操作符

arr和10为操作数

比如:

访问下标为7的元素, arr[7]

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", arr[7]);
	return 0;
}

输出为:

数组的输出

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0;i < 10;i++) {
		printf("%d\n", arr[i]);
	}
	return 0;
}

数组的输入

c 复制代码
for (int i = 0;i < 10;i++) {
	scanf("%d", &arr[i]);
}

一维数组在内存中的存储

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0;i < 10;i++) {
		printf("&arr[%d]=%p\n",i,&arr[i]);//打印各个元素的地址
	}
	return 0;
}

x64:64位程序,地址长

x86:32位程序,地址短

可以看出,相邻两个元素(int)的地址相差4 ,这是因为每个元素(int)占四个字节,一维数组在内存中是连续存放

sizeof计算一维数组元素的个数

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
	printf("%zd\n", sizeof(arr));//计算的是整个数组的大小,单位是字节  10*4=40
	printf("%zd\n", sizeof(arr[0]));//每个元素所占大小  4
	printf("%d\n", sizeof(arr) / sizeof(arr[0]));//元素个数   10
	return 0;
}

二维数组

二维数组的概念

数组的元素都是内置类型的,如果我们把一维数组做为数组的元素 ,这时候就是二维数组

二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组

二维数组的创建

c 复制代码
type arr_name[常量值1][常量值2];//常量值1表示行,常量值2表示列

二维数组的初始化

c 复制代码
//完全初始化
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
//   1   2   3   4   5
//   6   7   8   9   10
//   11  12  13  14  15 
c 复制代码
//不完全初始化
int arr[3][5] = { 1,2,3,4,5,6,7,8};
//   1   2   3   4   5
//   6   7   8   0   0
//   0   0   0   0   0
c 复制代码
//按行初始化
int arr[3][5] = { {1,2},{3,4},{5,6 } };
//   1   2   0   0   0
//   3   4   0   0   0
//   5   6   0   0   0

二维数组如果初始化了,行可以省略,但是列不能省略

c 复制代码
int arr[0][5] = { {1,2},{3,4},{5,6 } };

二维数组的下标

二维数组的行是从0开始的,列也是从0开始的

c 复制代码
int arr[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};

访问二维数组中的元素:

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	//   1   2   3   4   5
	//   2   3   4   5   6
	//   3   4   5   6   7
	printf("%d", arr[2][4]);//打印二行四列的元素
	return 0;
}

输出结果为:

二维数组的输出

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	for (int i = 0;i < 3;i++) {      //行
		for (int j = 0;j < 5;j++) {  //列
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

输出为:

二维数组的输入

c 复制代码
for (int i = 0;i < 3;i++) {
	for (int j = 0;j < 5;j++) {
		scanf("%d ",&arr[i][j]);
	}
}

二维数组在内存中的存储

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	for (int i = 0;i < 3;i++) {      
		for (int j = 0;j < 5;j++) {  
			printf("&arr[%d][%d]=%p\n ",i,j,&arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

输出为:

可以看出,相邻两个元素(int)的地址相差4,二维数组在内存中并不是多行多列排列,也是连续存放

二维数组的每一行是一个一维数组 ,且

arr[0]为第一行的数组名

arr[1]为第二行的数组名

.

.

.

C99中的变长数组

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式

C99中引入了变长数组的概念
变长数组(variable-length array,简称VLA) 就是数组大小是变量的数组

c 复制代码
 int arr1[10];//常量
 int arr2[3+5];//常量表达式

VS2022不支持C99中的变长数组,但gcc支持

c 复制代码
	int n=10;
	int arr[n];

变长数组的数组长度只有运行时才能确定,因此变长数组不能初始化

c 复制代码
#include <stdio.h>
int main(){
	int n=0;
	int arr[n];
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
	for(int i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
	
	
	return 0;
} 

输出为:

``

练习:多个字符从两端移动,向中间会汇聚

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main() {
	char arr1[] = "welcome!!!!!!";
	char arr2[] = "#############";
	int left = 0;
//	int right = sizeof(arr1) / sizeof(arr1[0])-2;//a  b  c  \0 长度为4
//	int right = sizeof(arr1) -2;//字符类型数组可不除sizeof(arr1[0])
	int right = strlen(arr1 - 1);
	//strlen求字符串长度,统计的是\0前的字符个数
	while(left<=right){
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//休眠1000ms
		system("cls");//执行系统命令,库函数 cls清屏
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

END...

ps:快期中了...

没写完的功课,没准备的考试,

没做完的PPT,没想出的方案,

没什么理由,也不想找什么借口,

我只是有点累了,所以想停一下

我学会了直面自己的脆弱,

学会了正视那个偶尔没电的自己,

不再反复质疑自己"是不是不够努力"

我很棒,我只是有点不在状态,

找个公园躺下,看看天空透透气,然后又恢复力气

相关推荐
尘浮生3 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow16 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull26 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i35 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落37 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list