C语言数组

C++学习之路【1】:标C数据结构和算法

数组

数组:分配内存存储区的第二种方式
在这里插入图片描述
数组可以用来表达多个连续的同类型存储区,这些存储区叫做数组的元素。
数组也需要先定义然后才能使用,格式:存储区数据类型 数组名[存储区个数] = {初始值};
例如:

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

定义数组的时候也需要提供一个类型名称和数组名称,另外还需要提供一个整数,这个整数用来表示数组里的存储区个数
在这里插入图片描述
数组通常不会作为整体使用,只会一个一个的使用其中的某个存储区
数组里每个存储区有一个编号,这个编号叫做数组的下标
数组里第一个存储区的下标是0,向后依次递增
有效下标的范围从0开始到存储区个数减一为止,超过范围的下标不可以使用,数组越界
数组名称和下标一起可以用来表示数组里的存储区,格式:数组名 [下标] – a[0] 表示数组中下标为0的存储区
数组名 不可以代表存储区,它代表数组里第一个存储区的地址,也是数组的首地址

#include<stdio.h>
int main(void){
	int a[5] = {1,2,3,4,5};
	//printf("%d %d %d %d %d\n",a[0], a[1], a[2], a[3], a[4]);
	for(int i = 0; i < 5; i++){
		printf("%d ", a[i]);
	}

	//数组越界,非法访问
	printf("a[8] = %d\n", a[8]); //error
	return 0;
}

获取某个存储区的首地址,格式:&存储区
&a[3] 表示下标为3的存储区的首地址

如果初始化数据个数比存储区个数多就忽略后面多余的初始化数据
如果初始化个数比存储区个数少就把后面的存储区自动初始化成0
如果初始化数据个数和存储区个数一样多就可以省略数组定义里的存储区个数

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr[5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr[10] = {1};	// a[0] = 1,其余都是0
int arr[10] = {0};	// 全0
int arr[10] = {};	// 全0

int arr[] = {1, 2, 3, 4, 5};	// ==int arr[5] = {1, 2, 3, 4, 5};
int arr[10];	//不建议,分配的数组存储区的内容为随机数

可以对数组名称进行sizeof计算,结果是数组里面所有存储区的总内存大小
sizeof(数组名) -> 获取数组占据的内存大小
可以对数组存储区进行sizeof计算,结果是数组存储区的内存大小
sizeof(数组元素) - sizeof( a[0] )
sizeof(数组名) / sizeof(数组元素) 可以得到数组(存储区)个数
printf(“%lu\n”, sizeof(a) / sizeof(a[0]) ); // 20 / 4 = 5

#include<stdio.h>
int main(void){
	int a[5] = {1, 2, 3, 4, 5};
	//元素个数写死,不方便后期维护,可用sizeof(a)/sizeof(a[0])代替
	//for(int i = 0; i < 5; i++)
	int num = sizeof(a)/sizeof(a[0]);  // 获取a数组长度
	for(int i = 0; i < num; i++){
		printf("%d ", a[i]);
	}
	printf("sizeof(a) = %lu\n", sizeof(a));  // 20
	printf("sizeof(a[0] = %lu\n)", sizeof(a[0]));  // 4
	return 0;
}

练习:键盘输入10个数字然后倒序输出

#include<stdio.h>
int main(viod){
	int arr[10] = {0};	//定义数组,分配了10个int类型存储区
	int size = sizeof(arr) / sizeof(arr[0]);
	for(int i = 0; i < size; i++){	
		scanf("%d", &a[i]);
	}
	printf("reverse:");

	for(int j = 9; j >= 0; j--){
		printf("%d ", a[j]);
	}
	printf("\n");
	return 0;
}

变长数组

C99规范里可以使用变长数组
声明变长数组的时候用变量表示数组里的存储区个数
变长数组里包含的存储区个数在某一次程序执行过程中不会改变,如果程序多次运行则每次运行的时候变长数组里包含的存储区个数可能不同
变长数组不可以初始化

/*
int n;
scanf("%d", &n);
int a[n];  //c99动态数组
*/
#include<stdio.h>
int main(void){
	int n = 0;
	printf("input length of array:");
	scanf("%d", &n);

	int a[n];	//数组长度为n

	//赋值
	for(int i = 0; i < n; i++){
		a[i] = i + 50
	}
	for(int i = 0; i < n; i++){
		printf("%d", a[i]);
	}
	printf("\n"); 
	return 0;
}

二维数组

需求:一个班级有50个人,描述一个班级的成绩
方法1:一个班级有50个人,描述50个学生的成绩 —> int a[50];
方法2:一个班级有50个人,共分为5组,每组10个人 —> int a[5][10];
在这里插入图片描述
每一个格子都是int类型的存储区
此时将50个int类型的存储区分为5组,每组10个int类型的存储区
每一组都是多个连续的同类型存储区,每一组都是一个一维数组
二维数组:
由多个一维数组组成的数组 int score[5][10]
二维数组的每个元素都是一维数组
一维数组的每个元素表示的都是一个存储区
定义二维数组的时候需要提供两个整数,前一个整数表示一维数组个数,后一个整数表示一维数组里的存储区个数
数据类型表示的是每个存储区的类型

int score[5][10];
//定义了一个二维数组,一共分为了5个一维数组,每个一维数组有10个int类型的存储区

格式:
元素类型 数组名[二维数组长度] [一维数组长度] = { {…}, {…}, …};
二维数组长度 - 二维数组中有几个一维数组
一维数组长度 - 一维数组中有几个存储区
举例:
int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
可以把二维数组当做是一个一维数组进行初始化,二维数组本质还是一维数组
int mat[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
int mat[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
在这里插入图片描述
mat[0] [1]

#include<stdio.h>
int main(void){
	int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
	
	//打印输出每个元素的值
	for(int i = 0; i < 3; i++){
		//printf("%d %d %d %d", a[i][0], a[i][1], a[i][2], a[i][3]);
		for(int j = 0; j < 4; j++){
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

随机数
#include <stdlib.h> //srand() rand()
#include <time.h> //time()
srand( time(0) ); //设置一个随机数种子
rand() - 表示一个随机数的整数
rand()% 10 - 表示的是0-9之间随机数

练习
双色球游戏
获取6个1-33之间的数字(不可以重复)作为红球
获取1个1-16之间数字作为蓝球

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值