C语言学习过程总结(8)——数组

数组

今天的大标题很简单,就两个字,但包含的东西可是不少,废话少数,直接开学!

1.什么是数组

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

*存放一个或多个数组,元素个数不为0;

*存放的数据类型是相同的

数组分为一维数组和多维数组,多维常见的就是二维数组

2.数组的创建和初始化

创建

type arr_name[常量值];

类型  数组名字 大小 

数组在创立的时候就指定数组的大小和数组的元素类型

类型可以是:char、short、int、float等,也可以是自定义的

名字就根据实际情况来取,有意义,方便自己观察即可,如年龄的数组可以用age

[ ]中的常数值就是来制定数组的大小

初始化

一般使用大括号

int arr[5] = {1,2,3,4,5}; //完全初始化

 int arr2[6] = {2};//不完全初始化,第一个元素是2,后面默认初始化为0

int arr3[3] = {1,2,3,4};//错误初始化,只能放3个却放了4个,造成数据越位

数组的类型

数组中的元素有类型,数组本身也有类型,数组算是一种自定义的类型,去掉数组名后就是数字的类型

int arr[10]; 的类型就是 int [10]

3.数组怎么使用

知道了怎么创建和初始化数组,那我们创建好的数组要怎么去使用呢?

先引入一个概念:数组下标

小标从0开始到n-1结束

数组元素12345678910
下标0123456789

对于数组的访问有一个新的操作符:下标引用操作符 [ ]

arr[7]就是数组下标为7的元素

以下面简单的代码为例就很好理解

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

for循环访问整个数组(输入和输出)

#include<stdio.h>
int main() {
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i < 10; i++) {
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}

}

当然,scanf和printf可以放在同一个for循环里面

4.数组在内存中的存储

计算机会把所有的数据都放在内存处理

内存又会被划分成一个个内存单位,一个内存单位的大小是一字节

内存单位可以通过编号找到其在内存中的具体位置

(编号==地址==C语言中的指针)

每次产生的地址都不一样

下面是打印出数组元素地址的代码


#include<stdio.h>
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("&arr[%d] = %p\n", i, &arr[i]);
	}
	return 0;
}

可以看出哪怕代码数据一样,在内存中开辟的空间位置也不一样

注意:

*每个相邻的元素之间差距是4(一个整形四个字节),所以数组中是元素是连续存放的

5.计算数组中元素个数

我们知道sizeof可以计算类型或者变量的大小,它也可以计算数组的大小

#include<stdio.h>
int main() {
    int arr[10] = { 0 };
    printf("%d", sizeof(arr));
    return 0;
}

上诉代码的输出结果是40(字节)

 个数*单位大小==总量大小

sizeof既然可以计算数组大小也可以计算数组中单个元素的大小

sizeof(arr[0]);

那元素个数就是:sizeof(arr)/ sizeof(arr[0]) 

#include<Stdio.h>
int main() {
	int arr[10] = { 0 };
	//printf("%d", sizeof(arr));
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d", sz);
	return 0;
}
//输出10

 好处:通过公式而不是具体的数字来表示数组元素个数,这样无论数组个数怎么变化,公式结果随着改变,大大增强了代码应对“变化”的能力。

6.二维数组

说完一维数组,那二维数组是什么?

二维数组是将一维数组作为元素是数组,以此类推,三维数组就把二维数组作为元素是数组

11234512345
intintintintintint23456
数组元素一维数组34567
intintintintint
二维数组

创建

和一维数组一样

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

常量值1表示行数。常量值2表示列数 

初始化

一样使用{}初始化 

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

 int arr1[3][5] = {0};

不完全初始化后

0123401234
012000000000
100000100000
200000200000
               arr1数组                   arr2数组

完全初始化

int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6 3,4,5,6,7};

按照行初始化 

可以把数据更准确的放入

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

01234
012000
134000
256000
                                                     arr4数组

     *初始化是省略行,不能省略列

      省行不省列

计算机是可以通过数据内存来决定行

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

7.二维数组的使用

下标

同一维数组一样,二维数组也有下标

行与列的下标均从0开始

通过行列下标的结合,我们可以快速定位到二维数组中的数据

输入输入和存储位置

因为在一维数组中已经讲过,下面博主将用一个代码同时实现这三个功能

#include<stdio.h>
int main() {
	int arr[3][5] = { 0 };
	//采用双for循环实现输入
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 5; j++) {
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 5; j++) {
			printf("%2d", arr[i][j]);
		}
		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]);
		}
		printf("\n");
	}
	return 0;
}

**每个相邻的元素之间差距是4(一个整形四个字节),所以二维数组中是元素是连续存放的

是不是觉得这句话很熟悉,没错,这就是一维数组的性质,博主直接复制粘贴

*二维数组的每个元素都是一维数组

8.C99中的变长数组

这只是做一个扩展,因为在vs中实现不了

int n = a+b;

int arr[n]; 

将数组的大小不在初始化时确定(变长数组不能初始化),而是在程序运行的时候精准的去分配内存。当然这不是说数组大小可变,数组的大小一旦确定就不会变。

9.结束语

今天的学习就先到这里吧,后续还有两个例题分享给大家,博主会加班加点赶出来的!

希望大家可以喜欢! 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值