目录
一、引言
相同类型的变量放在一起处理会方便很多,这个时候就要用到数组了。
二、一维数组
1、一维数组的创建
type_t arr_name [const_n];
// type_t 是指数组的元素类型// arr_name 是数组名
// const_n 是一个常量表达式,用来指定数组的大小
数组创建的三个例子:
//代码1
int arr1[10];
//代码2
int count = 10;
int arr2[count];
//代码3
char arr3[10];
float arr4[1];
double arr5[20];
如上,代码2中要介绍一个新的知识点,在C99标准之前,[ ]中必须是一个常量才行,不能使用变量。在C99标准之后,开始有了变长数组的概念,数组的大小可以使用变量指定,但是使用变长数组的时候数组是不能被初始化的。目前OJ在线编译环境都是支持变长数组的。
2、一维数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值,数组在创建的时候如果不想给数组确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。格式如下:
1. 直接在大括号内部放置数组内容,用逗号隔开:
int v[ ] = {1,2,3,4,5}; /*元素个数可以省略(自动认为是5)*/
2. 另外还有一个规则,就是用0对{}内没有赋初始值的元素进行初始化。因此,在下面的声明中,[2]之后的元素都使用0来初始化。
int v[5]= { 1,3 } ; /*用( 1,3,0,0,0)初始化*/
3. 如果要使用0初始化数组中的全部元素,这种情况虽然用0对没有赋初始值的v[0]进行初始化是理所应当的,但初始值被省略的v[1]之后的元素也用0进行初始化。具体就是可以下面这样
int v[5] = { 0 ) ; /*用(0,0,0,0,0)初始化 */
4. 当初始值的个数超过数组的元素个数的时候,程序会发生错误。int v[3]= {1,2,3,4); /*错误:初始值过多*/
5. 不能通过赋值语句进行初始化。下面是一个错误的例子。
int v[ 3];
v =[1,2,3); /*错误:不能使用赋值语句进行初始化*/
但是对于下面的代码要区分一下
当初始化为单个的字符时,数组内部就是对应的字符,数组大小也是字符的个数,但是当初始化为字符串时,会在字符串末尾加一个"\0",这也是字符串结尾的标志。
3、一维数组的使用
对于数组的使用我们之前介绍了一个操作符: [ ] ,下标引用操作符。它其实就是数组访问的操作符。
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。
#include <stdio.h>
int main()
{
int arr[10] = { 0 };//数组的不完全初始化,只初始化一个0,则全部元素都是0.
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
printf("%d\n", sz);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始
int i = 0;//作下标
for (i = 0; i < sz; i++)//这里写sz是前面对数组长度进行了计算
{
arr[i] = i;
}
//输出数组的内容
for (i = 0; i < sz; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
4、一维数组的存储
先看一段代码
可以发现随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。如下图所示。
二、多维数组(以二维数组为主介绍)
1、多维数组的介绍
上面的数组元素都是int型或double型等单一类型。实际上,数组的元素也可以是数组本身。以数组作为元素的数组是二维数组,以二维数组为元素的数组是三维数组。当然也可以生成维数更高的数组。二维数组以上的数组,统称为多维数组。
总结:多维数组是以数组为元素的数组。
2、二维数组的创建
//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
3、二维数组的初始化
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[ ][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略
4、 二维数组的使用
二维数组的使用也是通过下标的方式。代码与运行结果如下:
#include <stdio.h>
int main()
{
int j = 0;
int i = 0;
int k = 0;
int arr[3][4] = { 0 };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
arr[i][j] = k;
k++;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
5、二维数组在内存中的存储
看看下方的运行情况:
可以发现二维数组在内存中也是连续存储的,用图表示就是下面这样。
三、数组越界
数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,程序员写代码时,一定要自己做越界的检查。当然二维数组的行,列都是会存在越界的。
今天的分享就到这啦😉
如果我的文章对您有帮助,
请 “点赞” “收藏” “关注”
一键三连哦!
想了解更多知识请前往故里♡927的博客
如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。
我们下期见😉~~