二维数组名与二重指针之间的区别

1.
一个一维数组名,是对该一维数组中的第一个元素取地址。数值上是该一维数组的第一个元素的地址;逻辑上指向的是一维数组的第一个元素,所以将一维数组名+1所指向的是一维数组的下一个元素的地址;
eg. 一个int类型元素组成的一维数组名指向一维数组中的第一个元素(int类型),所以一维数组名类型为int*;
2.
2.1 一个二维数组名,是对该二维数组中的第一个一维数组名取地址。数值上与第一个一维数组名的值是相同的,即是第一个一维数组的第一个元素的地址;逻辑上指向的是二维数组的第一个元素,即二维数组中的第一个整一个一维数组,所以将二维数组名(即二维数组的第一个一维数组名的地址)+1所指向的是二维数组的下一个元素的地址,即二维数组中的第二个整个一维数组;
eg. 一个int类型元素组成的二维数组名指向二维数组中的第一个元素,即一整个一维数组(int[n]类型,n为该二维数组中的每一个一维数组的长度,n是已知的常量),所以二维数组名类型为int*[n](不是int**);
3.
一个三维数组名,是对该三维数组中的第一个二维数组名取地址。数值上与第一个二维数组名的值是相同的,也即与第一个二维数组的第一个一维数组名的值是相同的,也即是第一个二维数组的第一个一维数组的第一个元素的地址;逻辑上指向的是三维数组的第一个元素,即三维数组中的第一个整一个二维数组,所以将三维数组名(即三维数组的第一个二维数组名的地址)+1所指向的是三维数组的下一个元素的地址,即三维数组中的第二个整一个二维数组;
eg. 一个int类型元素组成的三维数组名指向三维数组中的第一个元素,即第一个一整个二维数组(int[n][m]类型,n为该三维数组中的每一个二维数组的行数,m为该三维数组中的每一个二维数组的列数,m和n都是已知的常量),所以三维数组名类型为int*[n][m](不是int***);

	int a[2][2] = { 1,2,3,4 };
	cout << &a << endl;//a是二维数组名,&a是二维数组名的地址,所以&a指向一整个二维数组(类型为int[2][2]),所以&a的类型为int*[2][2]
	cout << a<<endl;//a是二维数组名,是一维数组名的地址,所以a指向一整个一维数组(类型为int[2]),所以a的类型为int*[2]
	cout << *a << endl;//a是二维数组名,是一维数组名的地址,所以*a是一维数组名,指向一维数组中的一个元素(类型为int),所以*a的类型为int*
	cout << &a[0] << endl;//a[0]是一维数组名,&a[0]是一维数组名的地址,所以&a[0]指向一整个一维数组(类型为int[2]),所以&a[0]的类型为int*[2]
	cout << a[0]<<endl;//a[0]是一维数组名,所以a[0]指向一位数组中的一个元素(类型为int),所以a[0]的类型为int*
	cout << *a[0]<<endl;//a[0]是一维数组名,所以*a[0]就是(不是指向)一维数组中的一个元素(类型为int),所以*a[0]的类型为int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值