1.一维数组
1.1一维数组的创建
type name [const] //这是数组的表现形式
//type是数组的类型,可能是int,double,char类型等等
//name是数组名称,可以输入一个与项目相关的名称,后期好辩认
//const在[]内,表示数组的大小,一般是常量
上面提到了const一般是常量,但如果我们按照下面的这样写,可以吗?
//例1
int a = 10;
int b[a];//此处[]内是变量
//例2
int b[10];
//它们表示的含义是一样的,但是例1是变长数组,仅在c99标准下支持,常用的vs是不支持变长数组
//但是常用的刷题网站力扣,牛客是支持c99标准的
注释:变长数组是数组大小待定的数组,C语言中结构体的最后一个元素可以是大小未知的数组
1.2一维数组初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值
int a[5]={1,2,3,4,5};
//整形数组,元素有5个,分别是1,2,3,4,5(完全初始化)
int c[5]={1,2,3};
//整形数组,元素有5个,分别是1,2,3,0,0(不完全初始化)
//一般不完全初始化,后面的元素都由0来补全
int b[]={1,2,3,4,5,6,7,8,9};
//整型数组,元素个数未知,一般由初始化中内容确定
//此处元素是1-9,共九个,所以数组元素个数9
在字符数组初始化的时候有几个特别注意的
char a[3]={'a','b','c'};
//字符数组,元素个数3个,分别是a,b,c
char b[]={'a','b','c'};
//字符数组,元素个数未知,初始化成a,b,c,但不能确定个数,是个随机值
//因为字符的结束标志是"\0",这里只有'a''b''c',所以系统会从后面一直去找"\0",直到找到为止,从而计算a-\0
//共有多少个元素,就确定数组元素个数
char c[]={"abcdef"};
//字符数组,元素个数7个,a-f有六个元素,"\0"为一个,一共七个元素
1.3一维数组的使用
如何去使用数组中的每一个元素,如何将它们调出来,我们这里用到了这个操作符[ ],数组下标引用操作符,每一个数组的下标都是从0开始的,例如:
#include
int main()
{
int a[5]={1,2,3,4,5};
int i=0;
for(i=0;i<5;i++)
{
printf("%d ",arr[i]); //i从0开始打印一直到4,一共访问了数组5个元素,
} //正好将数组全部元素都访问并且打印出来了
return 0;
}
//试想一下,如果数组为int a[]={1,5,9,8,2,4,6,7},不知道元素个数是多少?for循环中的i应该怎么限定?
//方法如下:
//应用关键字sizeof计算数组大小(记住sizeof是关键字,不是库函数,后面有用)
#include
int main()
{
int a[]={1,5,9,8,2,4,6,7};
int sz=sizeof(a)/sizeof(a[0])
//sizeof(a)//整个数组的大小
//sizeof(a[0])//数组一个元素的大小
int i=0;
for(i=0;i
1.4一维数组在内存中的存储
一维数组在内存中的存储是连续的,且内存地址是由低到高存放的,我们用一段代码来证明一下
#include
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(a) / sizeof(a[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&a[%d]=%p\n", i, &a[i]);
}
return 0;
}
ctrl+f5看结果
结果验证了两个结论,数组元素是连续存放,每个间隔四个字节,且数组元素存储是从低地址到高地址。
2.二维数组
2.1二维数组的创建
type name [const1] [const2]
//type 数组类型
//name 数组名称
//const1 二维数组的行
//const2 二维数组的列
int a[3][5];
//整形二维数组,3行5列共15个元素
2.2二维数组初始化
int a[3][5]={1,2,3,4};
int b[][5]={1,2,3,4,5,6,7,8,9};
//在数组初始化的时候,可以省略行,但不可以省略列
//因为省略就不能体现出它是个二维数组
//所以下面两组二维数组,初始化是错误的
int c[][]={1,2,3,4,5,6};
int d[3][]={1,2,3,4,5,6};
2.3二维数组的使用
二维数组和一维数组使用方法基本一致,我们看一段代码,即可了解
代码如下:
#include
int main()
{
int arr[3][4] = {0};
int i = 0;
for(i=0; i<3; i++) //此处循环的是行
{
int j = 0;
for(j=0; j<4; j++) //此处循环的是列
{
arr[i][j] = i*4+j;
}
}
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
2.4二维数组在内存中储存
跟一维数组一样,在内存也是连续存放的,我们写一段代码,并查看他的结果
代码如下:
int main()
{
int arr[3][4];
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
从结果可以看出1行和2行的地址是相连的,两两元素都是差4个字节,并没有说跨行了就差很多。
3.数组越界
正常的数组下标是有限制的,数组有n个元素,数组下标小于0或者大于n-1,此时数组就会越界访问,越界访问不会引起编译器错误,甚至不影响运行,但是数组越界是错误现象,在某些时候是会出错的,所以我们要合理使用数组,不要越界