*c语言学习笔记(十四)*
本节内容:数组
一、一维数组的创建和初始化
1、数组的含义:数组是一组相同类型的元素的集合;
2、数组的创建方式:
int(类型)arr(名称)[20(元素个数,需要是常量表达式)];
所以数组可以是整型也可以是其他类型的。
3、数组不完全初始化时,其余的空位默认为0;另外字符型的数组初始化时,也可以使用字符串型形式初始化,系统会自动按顺序存储字符;还可以利用ASCII值来代替对应字符;
char arr[] = "abcde";
printf("%d ", sizeof(arr));
printf("%d ", strlen(arr));
关于上面的三行代码,问最后执行的结果为多少:答案为6 、 5
这里解释下为什么会出现这样的结果:首先sizeof的作用为计算arr数组的长度,这里是字符串,因此最后一个隐藏字符为\0,而strlen()是用来计算字符串长度,不包括\0,,所以结果如上。
注:当以字符串形式来初始化数组时,结尾会包含\0,而用单个字符来初始化时,则不会包含;但是以单个字符初始化,必须事先指明数组包含字符的具体个数;
二、一维数组在内存中的存储
为了研究数组在内存中的存储方式,我们要查看数组内内容在内存中的存储地址
char arr[] = "abcde";
int i = 0;
for (i = 0; i < 5; i++)
{
printf("arr[%d]:%p \n", i, &arr[i]);
}
利用上面的代码查看数组存放的地址
输出结果为:
我们发现每个数组元素存放的地址都是连续的;故数组在内存中是连续存放的。
三、二维数组的创建与使用
1、二维数组的创建方式,假定创建一个int型的二维数组:
首先给出一个思想,因为二维数组一定会是一种矩阵类型的,而不是说单独的两个一维数组:
int arr[3][4];
这里的意思就是创建一个三行四列的数组
2、二维数组的初始化方式
为了说明方式,采用调试监控的方法来查看数组的具体情况;
首先给出代码:
int arr[3][4] = { {1,2,3},{2,3,5,6} };
我们发现花括号里面的内容被分配给了二维数组的每一行元素,假设元素个数不满足数组列数,那么空余位置全部默认为0;
3、二维数组的使用
当我们想调用二维数组的某一具体值时,用法同一维数组类似,需要注意的一点是:无论几位数组,在计算机中数组的下标都是从0开始的
假设我们想要输出数组的第二行第三个数字,那么应该是"arr[1][2]";
时刻记着减一就好了。
下面我们试着打印出来我们定义的二维数组的每一位,我用换行来区分不同行数,这样看起来二维数组更像矩阵(或者行列式,无所谓了)
代码如下:
int arr[3][4] = { {1,2,3,4},{2,3,5,6},{7,8,8,9} };
int i = 0;
int j = 0;
printf("自定义数组为:\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
使用for循环嵌套,换行的原理就是在行数+1时,额外输出一个换行符;
结果如下:
在代码中修改,创建一个指针变量,我们试着输出二维数组的存储地址:
int* pa = &arr[i][j];
printf("%p ", pa);
输出结果:
我们发现二维数组在内存中也是连续存储的。跟一维数组一样,在内存中并没有特殊标记。那么怎么区分一维二维数组呢,我们可以把二维数组想象成n个一维数组,n是二维数组的行数。