C语言数组(详解)

在这里插入图片描述

🫰欢迎大家评论📝点赞👍收藏⭐

数组

数组的概念

一维数组

1.一维数组的创建和初始化

 1.1数组的创建

 1.2数组的初始化

  a.整型数组的初始化

   b.字符数组的初始化

 1.3数组的类型

2.sizeof计算数组元素个数

3.⼀维数组的使⽤

 3.1数组的下标

 3.2数组的输入输出

   c.整型数组的输入输出

    d.字符数组的输入输出

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

二维数组

1.⼆维数组的概念

2.⼆维数组的创建

3.⼆维数组的初始化

4.⼆维数组的使⽤

 4.1⼆维数组的下标

  4.2⼆维数组的输⼊和输出

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

C99中的变⻓数组

数组
数组是⼀组相同类型元素的集合;
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。
数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。
一维数组
1.一维数组的创建和初始化
1.1数组的创建
⼀维数组创建的基本语法:

 type arr_name[常量值];

存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的⼤⼩和数组的元素类型。
• type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以⾃ 定义的类型
• arr_name 指的是数组名的名字,这个名字根据实际情况,起的有意义即可。
• [] 中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定即可。
1.2数组的初始化
  a.整型数组的初始化
在创建变量或者数组的时候,给定⼀些初始值,被称为初始化。
数组的初始化⼀般使⽤⼤括号,将数据放在⼤括号中。初始化的个数不能超过数组的大小

int main()
{
	int arr1[5] = { 1,2,3,4,5 };//完全初始化
	int arr2[100] = { 1,2,3,4,5};//不完全初始化,剩余未初始化的默认初始值为0
	return 0;
}

注意👀
在这里插入图片描述

  b.字符数组的初始化
在这里插入图片描述
注意👀:
1.

char str1[5] = { 'a','b','c','d', '\0' };//字符数组中含有\0字符,也称为字符串
char str2[5] = "abcd";//此字符数组存的是abcd\0,等价于str2[5] = { 'a','b','c','d', '\0' }

2.

char str1[100] = "";//双引号中含有一个\0,此字符数组中存了100个\0
char str2[100] = { 0 };//\0的ASCII为0,此字符数组中也存了100个\0,等价于str5[100] = ""

3.

char str[] = "hello world!";//此字符数组有13个元素(空格与末尾的\0也存入了)

4.

char str1[] = { 'a','b',0,'c' };//\0的ASCII为0,因为是char类型,此处会将0转化为\0,故会打印出ab
char str2[] = { 'a','b','0','c' };//‘0’为字符0,%s打印时未遇到\0,故会打印出ab0c乱码
char str3[] = { 'a','b','\0','c' };//打印出ab

1.3数组的类型
数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型。
在这里插入图片描述
2.sizeof计算数组元素个数
sizeof中C语⾔是⼀个关键字,是可以计算类型或者变量⼤⼩的,其实sizeof也可以计算数组的⼤⼩。
在这里插入图片描述
在这里插入图片描述
3.⼀维数组的使⽤
3.1数组的下标
C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号,如下

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

在这里插入图片描述
在C语⾔中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引⽤操作符。
在这里插入图片描述
3.2数组的输入输出
  c.整型数组的输入输出
在这里插入图片描述

  d.字符数组的输入输出
输入📚:
1.

#include<stdio.h>
int main()
{
	char str[128] = "";//初始化,元素的初始值全为\0
	scanf("%s", str);
	//scanf %s格式读取字符串是遇到\n结束,遇到空格也结束。
	//若存放字符的空间不足,也会继续读取,会造成内存污染
    printf("%s\n", str)
	return 0;
}

2.

gets(数组元素首地址)是一个库函数,从键盘读取字符串,定义在<stdio.h>头文件中
#include<stdio.h>
int main()
{
	char str[128] = "";
	gets(str);//,遇到\n结束,但遇到空格不结束
	//有时也会造成内存污染
	printf("%s", str);
	return 0;
}

3.

fgets(数组元素首地址)库函数,从键盘读取一个字符串,定义在<stdio.h>头文件中
#include<stdio.h>
#include<string.h>
int main()
{
	char str[128];
	fgets(str, sizeof(str), stdin);//fgets从stdin(标准输入-键盘)读取字符串到str数组中,最大可以读sizeof(str)-1个字符(会自动加\0)
	//不会造成内存污染,但会把\n,空格都读取,在输入时若不想读取\n,我们可以找到最后一个字符的下标,
	//以便将\n用\0替代,结束读取,这里可以借助库函数strlen(数组元素首地址)(其头文件为<string.h>)得到字符数组的有效字符个数
	str[strlen(str) - 1] = 0;
	printf("%s\n", str);
	return 0;
}

注意⚠️
在这里插入图片描述
输出📚:
1.
在这里插入图片描述
2.
在这里插入图片描述
4.一维数组在内存中的存储

在这里插入图片描述
Int-4个字节   16进制中c代表12   地址依次增加4
结论:一维数组在内存中是连续存放的
二维数组
1.⼆维数组的概念
前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。
在这里插入图片描述
2.⼆维数组的创建
语法如下:

type arr_name[常量值1][常量值2];
            行数    列数

例如:

int[3][5];//数组为3行,5列的
double data[2][8];

3.⼆维数组的初始化
⼆维数组的初始化像⼀维数组⼀样,一般也是使⽤⼤括号初始化的。
在这里插入图片描述
注意⚠️
在这里插入图片描述
4.⼆维数组的使⽤
4.1⼆维数组的下标
⼆维数组访问也是使⽤下标的形式,⼆维数组有⾏和列,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰:

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

在这里插入图片描述
4.2⼆维数组的输⼊和输出
在这里插入图片描述
5.⼆维数组在内存中的存储
在这里插入图片描述
地址均相差4,即二维数组中元素是一行接着一行连续排列的
在这里插入图片描述
可理解为由3个一维数组组成,每个一维数组中有5个元素
C99中的变⻓数组
在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组⼤⼩。
如:

1 int arr1[10];
2 int arr2[3+5];
3 int arr3[] = {1,2,3};

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

1 int n = a+b;
2 int arr[n];

变⻓数组的根本特征,就是数组⻓度只有运⾏时才能确定,所以变⻓数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可以在运⾏时为数组分配精确的⻓度。有⼀个⽐较迷惑的点,变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。数组的⼤⼩⼀旦确定就不能再变化了。
VS2022虽然⽀持⼤部分C99的语法,但没有⽀持C99中的变⻓数组,没法测试;可在gcc编译器上测试。

1 #include 
2 int main()
3 {
4 int n = 0;
5 scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩ 6 int arr[n];
7 int i = 0;
8 for (i = 0; i < n; i++)
9 {
10 scanf("%d", &arr[i]);
11 }
12 for (i = 0; i < n; i++)
13 {
14 printf("%d ", arr[i]);
15 }
16 return 0;
17 }

在这里插入图片描述
          如果觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源🌹🌹🌹
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

engrave行而不辍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值