浅析二维数组

介绍二维数组之前,简单介绍一下数组的一些基本知识。

 

大家都知道数组是不能拷贝和赋值的。

 **********************************************************************************************

        例如: int TestArray[] = {0, 1, 2, 3};    

                int  TestArrayCopy[](ia);                                         错误 (不能使用一个数组初始化(initialization)另外一个数组)

                int AnthorArray[3];  AnthorArray = TestArray;     错误 (不能使用一个数组赋值(assignment)给另外一个数组)

**********************************************************************************************

因此我们把当我们使用数组名时,编译器会为我们自动转换为指向数组第一个元素(when we use the name of array  it is automatically converted to a pointer to the first element of the array),  

 

举个例子来说吧, int a[3] = {1, 2, 3}

一:  当我们使用数组名a时,编译器自动为我们转换为数组的第一个元素,由于数组的元素是int类型的,所以我们可以int类型的指针。 int* p= a; 此时如果进行p+ 1 操作, 跨度是一个元素

 

二: 假如我们使用的是&a, 就是整个数组了,因此我们要定义成 int (*p)[3] = &a;  此时如果进行p+ 1 操作, 跨度是整个数组

 

 

严格意义上来讲, C++中不存在多维数组的,通常我们所指的多维数组,其实就是数组的数组(what is commonly referred to as a multidimensioned array is actually an array of arrays)

 

举个例子来说吧, int a[2][3] = {1, 2, 3, 4, 5, 6}

一:  当我们使用数组名a时,编译器自动为我们转换为数组的第一个元素,由于不能存在多维数组,编译器会认为只有两个元素,只不过元素内部又包含数组,数组的类型为int[3]

所以我们用int (*p)[3]类型的指针。因此定义为int (*p)[3] = a; 此时如果进行p+ 1 操作, 跨度是一个元素(只不过这个元素的内部又了数组int[3])

 

二: 假如我们使用的是&a, 就是整个二位数组了,因此我们要定义成 int (*p)[2][3] = &a;  此时如果进行p+ 1 操作, 跨度是整个二位数组

 

三: 在进行二位数组初始化时,我们要注意以下问题

初始化该二位数组: 正确做法: memset(a, 0, sizeof(a)) // 注意操作符sizeof(a),

不会对a进行任何转换,大小为二位数组中所有元素的大小之和。

 

但是如果把该二维数组作为参数时,如void fun(int p[][3], int nSize)

前面已经提过,当我们使用数组名时,编译器自动为我们转换为数组的第一个元素,

因此 正确初始化方法为 memset(p, 0, sizeof(*p) * nSize) 其中*p,其实就是

元素的内部数组, 因此,元素内部数组大小 * 元素个数 = 二维数组所有元素大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值