每日一句:不为模糊不清的未来担忧,只为清清楚楚的现在努力。
数组是一些类型相同元素的集合。
数组的创建方式:
类型 数组名[大小];
例:
int arr[10];//数组的创建
int x_arr[10] = { 1,2,3,4,5,6,7,8,9,10 };数组的初始化
char x1_arr[10];
float x2_arr[10];
double x3_arr[10];
在C99中,引入了的变长数组的概念。什么是变长数组呢?
int n = 0;
scanf("%d", &n);
int x_4arr[n]//这个就是变长数组。大小由你自己来定。
注:变长数组不能初始化。在一些编译器里是不支持变长数组的使用的。
在全局变量中定义数组,数组初始值默认为0。
在局部变量中定义数组,数组初始值是随机数。
这就是他们两个的区别,但是不建议在全局变量中定义数组,因为你每次调用这个数组,都可能会改变这个数组的值,说白了,小伙子,你把握不住。
下面是代码实列:
直接上代码:
代码如下(示例):
int arr[6] = { 1,2,3,4,5,6};
printf("%d %d", arr[1], arr[5]);//
咦?为什么会是2和6呢?这是因为:数组的下标是从0开始的,你肯定会有疑惑为什么会是从0开始的,个人认为是因为偏移量的概念影响的吧。
所以想要输出1~6,你需要在[]里面填写0 ~5,这样才能把这个数组打印出来。
for (int a = 0; a < 6; a++)
{
printf("%d ", arr[a]);
}
话不多说,直接上代码:
代码如下(示例):
#include
int main()
{
int arr[100];
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d", sz);
return 0;
}
数组是使用下标来访问的,下标是从0开始的
数组的大小可以通过计算得到,就是上面的sz。
数组可以初始化赋值,也可以通过scanf来赋值,
#include
int main()
{
int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
for (int a = 0; a < sz; a++)
{
scanf("%d", &arr[a]);
}
for (int b = 0; b < sz; b++)
{
printf("%d ", arr[b]);
}
return 0;
}
这就是用for循环和scanf和printf来输入输出数组arr的值。
下面我们来探讨一下一维数组在内存中的存储方式
上代码:
#include
int main()
{
int arr[10];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i; i < sz; i++)
{
printf("arr[%d]=%p\n", i, &arr[i]);
}
return 0;
}
代码结果如下:
从这个结果里我们可以看到:随着数组下标的增长,地址也在有规律的增长
所以,数组在内存中是连续存放的。
但它为什么不是一个一个的增加呢?
这是因为int占四个字节,所以每次加4。
你也可以试试char float类型的哦。
二维数组的创建和初始化其实差不都,只是,二维数组是两个[],第一个[]代表行,第二个[]代表列。
给大家看个代码就知道了
#include
int main()
{
int arr[3][3];
int a = 0;
int b = 0;
for (a=0; a < 3; a++)
{
for (b=0; b < 3; b++)
{
scanf("%d", &arr[a][b]);
}
}
for (a=0; a < 3; a++)
{
for (b=0; b < 3; b++)
{
printf("%d ", arr[a][b]);
}
printf("\n");
}
return 0;
}
注:二维数组,行可以省略不写,但列是必须写的。
跟一维数组一样,把每个地址打印出来,
#include
int main()
{
int arr[3][3] = { {1,2,3},{1,2,3},{1,2,3} };
int a = 0;
int b = 0;
for (a=0; a < 3; a++)
{
for (b=0; b < 3; b++)
{
printf("arr[%d][%d]=%p ",a,b ,&arr[a][b]);
}
printf("\n");
}
return 0;
}
下面看结果
看,每次都加了4,所以,二维数组在内存中也是连续存储的。
数组的下标是从0开始的,数组有x个元素,那么第x个元素就是x-1
所以当下标小于0或者>x-1,数组就越界了,超出了数组能表示的范围。
所以在写代码的时候,一定要注意,数组是否越界访问了,不要坚定说:我写的代码怎么可能有错误,肯定是编译器错了。玩笑话,哈哈。
#include
int main()
{
int arr[3][3] = { {1,2,3},{1,2,3},{1,2,3} };
int a = 0;
int b = 0;
for (a=0; a <= 3; a++)//=3就越界访问了
{
for (b=0; b <= 3; b++)
{
printf("%d ",arr[a][b]);
}
}
return 0;
}
但不知道为什么,编译器没报错。
当出现这种数字的时候,大家要去看看是不是数组越界了哈。
个人认为,学编程,最重要的一点就是多敲,多看,多理解。