C语言 数组 基础知识

一,数组的概念

数组是一组相同类型元素的集合。数组分为一维和多维数组。

二,一维数组的创建和初始化

1.数组创建

基本语法:

1  type  arr_name[常量值] ;

type指的是数组中存放数据的类型。如:char,short,int ,也可以为自定义类型。

arr_name指的是数组名的名字,可以自己取。

2.数组的初始化

数组的初始化一般使用大括号,将数据放在大括号中。初始化又分为完全初始化和不完全初始化。

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

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

3.数组的类型

数组去掉数组名留下的就是数组的类型。例如:

1  int arr1[10];   //arr1数组类型是 int  [10]

2  int arr2[12];   //arr2数组类型是 int  [12]

3  char  ch[5];   //   ch数组类型是 char [5]

三,一维数组的使用

1.数组下标

数组的下标是从0开始的,如果有n个元素,那么最后一个元素的下标为n-1。

bae8740d25b94fff9f94d2556fb101c8.png

在数组的访问中,C语言提供了一个操作符[  ],这个操作符叫:下标引用操作符。

例如:我们访问下标为3的元素,那么就是使用arr[3],对应的数组元素就是4。

8b10dd2ae47448d083f5499471fef86a.png

2.数组元素的打印

接下来,如果想要访问整个数组的内容,那怎么办呢?
只要我们产⽣数组所有元素的下标就可以了,那我们使⽤for循环产⽣0~9的下标,接下来使⽤下标访问就⾏了。
 

3.⼀维数组在内存中的存储

我们要深⼊了解数组,最好能了解⼀下数组在内存中的存储。
依次打印数组元素的地址:
#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;
}
运行结果:

 

b2845d40b1474a23b23cd32c756bc737.png

从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
 

4.sizeof计算数组元素个数

我们可以使用sizeof来得知数组元素个数。sizeof 中C语言是⼀个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的大小。

例:

1 #include <stido.h>
2
3 int main()
4 {
5 int arr[10] = {0};
6 printf("%d\n", sizeof(arr));
7 return 0;
8 }
这⾥输出的结果是40,计算的是数组所占内存空间的总⼤⼩,单位是字节。
我们⼜知道数组中所有元素的类型都是相同的,那只要计算出⼀个元素所占字节的个数,数组的元素个数就能算出来。这⾥我们选择第⼀个元素算⼤⼩就可以。
#include <stido.h>
int main()
{
int arr[10] = {0};
printf("%d\n", sizeof(arr[0])); // 计算⼀个元素的⼤⼩,单位是字节
return 0;
}
 
接下来就能计算出数组的元素个数:
#include <stido.h>
int main()
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
 
这⾥的结果是:10,表⽰数组有10个元素。
以后在代码中需要数组元素个数的地⽅就不⽤固定写死了,使⽤上⾯的计算,不管数组怎么变化,计算出的⼤⼩也就随着变化了。(总的来说,就是整个数组的大小除以一个数组的大小,得到的就是数组元素的个数)
 

四,⼆维数组的创建

1.⼆维数组概念

前⾯学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元
素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。

2.⼆维数组的创建

语法:

type arr_name[常量值1][常量值2];
 
int arr[3][5];
double data[2][8];

注:

• 3表⽰数组有3⾏
• 5表⽰每⼀⾏有5个元素
• int 表⽰数组的每个元素是整型类型
• arr 是数组名,可以根据⾃⼰的需要指定名字,data数组意思基本⼀致。

3.⼆维数组的初始化

⼆维数组像⼀维数组⼀样,也是使⽤⼤括号初始化的。

a.不完全初始化

int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
fae9d4bd7ac44ffb9c9aeb5a492b8849.png

b.不完全初始化

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

c.按照⾏初始化

int arr4[3][5] = {{1,2},{3,4},{5,6}};
a904e62dc9834f6280e8eed1920cf15e.png
注:初始化时省略行,但是不能省略列,例:
int arr5[][5] = {1,2,3};
8b03325ccbe1462aa9cab966d703aba7.png
 

五,⼆维数组的使用

1.⼆维数组的下标

我们使⽤如何⼆维数? 其实⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定数组中的⼀个元素。
C语⾔规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰:
1 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

2.⼆维数组的输入和输出

代码演示

#include <stdio.h>
int main()
{
int arr[3][5] = {0};
//输入数据
int i = 0; //控制行
for(i=0; i<3; i++) // 产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) // 产⽣列号
{
scanf("%d", &arr[i][j]); // 输⼊数据
}
}
// 输出
for(i=0; i<3; i++) // 产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) // 产⽣列号
{
printf("%d ", arr[i][j]); // 输出数据
}
printf("\n");
}
return 0;
}
运行结果:

b09a17997f744ff0a9c440962442f0c7.png

六,⼆维数组在内存中的存储

⼆维数组中的每个元素都是连续存放的。

 

七,C99中的变⻓数组

C99中给⼀个变⻓数组的新特性,允许我们可以使⽤变量指定数组⼤⼩。
请看下⾯的代码:
int n = a+b;
int arr[n];
上⾯⽰例中,数组 arr 就是变⻓数组,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只有运⾏时才能知道 n 是多少。
变⻓数组的根本特征,就是数组⻓度只有运⾏时才能确定,所以变⻓数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定⼀个估计的⻓度,程序可以在运⾏时为数组分配精确的度。
注:变⻓数组的意思是数组的⼤⼩是可以使⽤变量来指定的,在程序运⾏的时候,根据变量的⼤⼩来指定数组的元素个数,⽽不是说数组的⼤⼩是可变的。数组的⼤⼩⼀旦确定就不能再变化了。

遗憾的是在VS2022上,虽然⽀持⼤部分C99的语法,没有⽀持C99中的变⻓数组。

 

 

 

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旅行的九月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值