二维数组中的指针加法计算 与 初始化

二维数组中的指针加法计算

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int a[3][4] = { {}, {1,2,3,4} }; //int[4] a[3]   T[3] a

	//整体上来说
	printf("sizeof(a)=%d  sizeof(int[3][4])=%d\n",
		sizeof(a),sizeof(int[3][4]));      //3X4X4=48
	 

	//int[4] a[3] 元素访问
	printf("sizeof(a[0])=%d sizeof(int[4])=%d\n",
		sizeof(a[0]), sizeof(int[4]));

	printf("==============================================\n");
	
#if 0

	int[3][4]

	1.首先 没加1的时候 他们的地址都是相同的,因为存放的物理结构是线性的

	2.但是 他们代表的层次是不一样的 二维数组的名字a代表层次是行 也是首元素的首地址
	因为是二维数组 所以这里的首元素是第一行整体 

	3.加& 理解为升* 二维数组的元素是一维数组 a[0]代表的层次就是一维数组 
	进行升*后 &a[0]就达到了二维数组的层次
 
#endif

	printf("a=%p\n", a);
	printf("&a=%p\n", &a);
	printf("&a[0]=%p\n", &a[0]);
	printf("a[0]=%p\n", a[0]);
	printf("&a[0][0]=%p\n", &a[0][0]);

	printf("---------------------------------------------\n");

	printf("a+1=%p\n", a + 1); //a为二维数组的行的层次 对它+1后加的是 一行的大小为16

	printf("&a+1=%p\n", &a + 1);//对a升*后 变成整个二维数组的层次 +1 加的是整个二维数组大小 为48

	printf("&a[0]+1=%p\n", &a[0]+1);//对a[0]升* 后变成二维数组的行的层次(与a相同) 所以+1的大小为16 

	printf("a[0]+1=%p\n", a[0] + 1);//a[0] 为一维数组的层次 +1 加的一维数组之间的大小 为4

	printf("==============================================\n");

	printf("a[1]=%p\n",a[1]); //二维数组第二行的地址 可以由 a+1 或 &a[0]+1 得到
	printf("a[1]+1=%p\n", a[1] + 1); //这个加1加的是4 为a[1]数组的步长 所以为4

	return 0;
}





二维数组的初始化

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	//行缺省初始化
	int b[3][4] = { {1}, {2,2}, {3} };

	//全局缺省初始化(统一先排第一行)

	int c[3][4] = {1,2,2,3};

	//全部初始化
	int a[3][4] = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("%d\t", a[i][j]);
		}
		putchar(10);
	}
	printf("----------------------\n");



	//二维数组行可以省略 而列不能省略
	int d[][4] = { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 };

	for (int i = 0; i < sizeof(d) / sizeof(d[0]); i++)  //利用sizeof求行数 size(d[0])可以想为int[4]
	{                                                   //相当于用二维数组总长度 除以 一行的长度大小
		for (int j = 0; j < 4; j++)
		{
			printf("%d\t",d[i][j]); //\t表示俩数之间空一大格子
		}
		putchar(10); //换到下一行  printf("\n");
	}

	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值