1.一维数组在内存中的储存
在前面创建的数组中,每个元素是怎么储存的呢?我们通过观察元素的地址来看看吧。
%p是用来打印地址的。
结果为:
由此可看出每个地址都相隔一个int类型的距离,可以看出数组在内存中是连续存放的。也就是说第一个元素后连着的就是第二个元素。
2.sizeof计算元素个数
sizeof是一个单目操作符,它的作用是计算占用内存的大小,单位字节。sizeof(表达式)是不会计算的,它只关心内存大小,当然sizeof(类型)也可以直接计算,如sizeof(int)的返回值就为4。
如果是int a =0; sizeof(a)的括号是可以省略的。
结果为:
但是直接计算类型大小时,不能把括号去掉。
大家来思考一下,这个结果会是什么呢?
在上面我们讲到sizeof(表达式)是不会计算表达式的,只会关心其内存。
结果为:
大家想到了没,结果是4。因为sizeof不会计算表达式,所以当它计算a+b时只会计算最先碰到的类型的大小,也就是a,又因为a的类型为int,所以占用内存为4个字节。
int main()
{
char a = 'w';
char b = 'd';
printf("%zd\n", sizeof(a+b));
return 0;
}
在这个代码中大家思考一下结果,想好了吗,我们来看一下。
结果为:
有人就会疑惑了,这个地方不应该等于1嘛,其实是因为两个字符类型的数值计算时,会自动进行整型提升,将其变成整型类型后进行计算。那么此时碰到的第一个a就是int 类型而不是char类型了。
这种情况主要是在字符类型在计算式出现。
在double类型中就没有出现整型提升,这是因为浮点型本身就可以进行计算,不需要提升为整型类型。
3.二维数组的创建
其实二维数组的创建很相似。一维数组是创建一行的元素,那么在二维数组中加上列即可。
如创建一个3行5列的数组,int arr[3][5];这样创建即可。
在图中就是二维数组的不完全初始化,也和一维数组一样,自动用0将其填满,完全初始化就是将其填满即可,如果想在哪一行放入那几个元素,只需要用大括号括起来进行赋值即可。
演示如下:
这样就可以将想要赋值的元素放在想要的位置。
二维数组的类型:去掉名字就是类型,例如:int arr[3][5];的类型就为int [3][5];
4.查找二维数组的元素
我们也需要用到[]这个操作符。在二维数组中每个元素也有一个下标,只不过现在的下标需要两个数字才能确定,当然在二维数组中,第一行和第一列也都是从0开始的。如我们需要查找第一行第一列的元素就可以用arr[0][0]即可。
演示如下:
5.打印所有的二位数组元素
我们需要使用一个循环来控制行,一个循环来控制列。
演示如下:
int main()
{
int arr[3][5] = { {1,2,3,4,5,},{2,3,4,5,6 },{3,4,5,6,7 } };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
通过两个for循环来完成。在内部的for循环打印5次时出来,加上printf(“\n”);是为了每打印五个就换一行,更好观察。
结果为: