一维数组2和二维数组1

1.一维数组在内存中的储存

在前面创建的数组中,每个元素是怎么储存的呢?我们通过观察元素的地址来看看吧。

%p是用来打印地址的。

一维数组2和二维数组1_第1张图片

结果为:

一维数组2和二维数组1_第2张图片

由此可看出每个地址都相隔一个int类型的距离,可以看出数组在内存中是连续存放的。也就是说第一个元素后连着的就是第二个元素。

2.sizeof计算元素个数

 sizeof是一个单目操作符,它的作用是计算占用内存的大小,单位字节。sizeof(表达式)是不会计算的,它只关心内存大小,当然sizeof(类型)也可以直接计算,如sizeof(int)的返回值就为4。

如果是int a =0; sizeof(a)的括号是可以省略的。

一维数组2和二维数组1_第3张图片

结果为:

一维数组2和二维数组1_第4张图片

 但是直接计算类型大小时,不能把括号去掉。

一维数组2和二维数组1_第5张图片

大家来思考一下,这个结果会是什么呢?

在上面我们讲到sizeof(表达式)是不会计算表达式的,只会关心其内存。

结果为:

一维数组2和二维数组1_第6张图片

大家想到了没,结果是4。因为sizeof不会计算表达式,所以当它计算a+b时只会计算最先碰到的类型的大小,也就是a,又因为a的类型为int,所以占用内存为4个字节。

int main()
{
	char a = 'w';
	char b = 'd';
	printf("%zd\n", sizeof(a+b));
	return 0;
}

在这个代码中大家思考一下结果,想好了吗,我们来看一下。

结果为:

 

一维数组2和二维数组1_第7张图片

有人就会疑惑了,这个地方不应该等于1嘛,其实是因为两个字符类型的数值计算时,会自动进行整型提升,将其变成整型类型后进行计算。那么此时碰到的第一个a就是int 类型而不是char类型了。

这种情况主要是在字符类型在计算式出现。

一维数组2和二维数组1_第8张图片

在double类型中就没有出现整型提升,这是因为浮点型本身就可以进行计算,不需要提升为整型类型。

3.二维数组的创建

 其实二维数组的创建很相似。一维数组是创建一行的元素,那么在二维数组中加上列即可。

如创建一个3行5列的数组,int arr[3][5];这样创建即可。

一维数组2和二维数组1_第9张图片

在图中就是二维数组的不完全初始化,也和一维数组一样,自动用0将其填满,完全初始化就是将其填满即可,如果想在哪一行放入那几个元素,只需要用大括号括起来进行赋值即可。

演示如下:

一维数组2和二维数组1_第10张图片 

 这样就可以将想要赋值的元素放在想要的位置。

二维数组的类型:去掉名字就是类型,例如:int arr[3][5];的类型就为int [3][5];

4.查找二维数组的元素

我们也需要用到[]这个操作符。在二维数组中每个元素也有一个下标,只不过现在的下标需要两个数字才能确定,当然在二维数组中,第一行和第一列也都是从0开始的。如我们需要查找第一行第一列的元素就可以用arr[0][0]即可。

演示如下:

一维数组2和二维数组1_第11张图片

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”);是为了每打印五个就换一行,更好观察。

结果为:

一维数组2和二维数组1_第12张图片 

谢谢

 

你可能感兴趣的:(c语言)