C++函数参数是多维数组,该怎么弄?

C++函数参数是多维数组,该怎么弄? 举个例子吧!比如传进来的多维数组初始化!会的教下,谢谢

今天,一个学徒向我提出了问题,说是不管他怎么理解,对于多维数组和多维指针还是不太明白,嗯,耐心的讲解了一番……还好不负所望,他听懂了,不然的话,咱这块老脸可就丢大了:),整理了一下,把今天讲给他听的放到网上来,供遇到同样问题的朋友参考,有理解错误的地方,还请各位高手指点。首先C++为矩形数组,意味着 int[2][3] 等于 int[6],int[2][3][4] 等于 int[24] 那为什么还需要多维数组?一维数组完全能完成多维数组的功能啊。原因是,这是为了方便算法的科学计数吧。就像一千万可以表示为:1000000 也可以表示为 0.1X10的8次方。int a[2] 这是一个一维数组,int *p=a,p是指向这个数组的指针。a存储的是这个数组内存的首地址,也就是说 a 等于 p 等于 数组内存首地址,所以,a[0] 的值等于 *p 等于 首个元素的值。思考,如果现在需要扩充这个数组怎么办呢?我们知道,一维数组a存储的是数组内存的首地址(a[0],a[1] 才是数组元素的值),那如果把 a[0] 的值换成另一个数组的内存首址,那不是就可以扩充这个数组了吗(前面说过C/C++用的是矩形数组,意味着,如果数组a里的任何元素存储了另一个数组的首地址,那么其它元素的存储值也必需是内存首地址)?假设,又定义了两个数组 : int aa[3],ab[3] 把 aa 首地址给a[0] ,把 ab 首地址给 a[1] ,这就形成了“数组的数组” ,即:一个数组内的元素值是了另一个数组的内存首地址,定义方法:int a[2][3],表示:我定义了一个数组,有两个元素,而每个元素的值,存储的是另一个 包含三个元素的 数组内存首地址。要怎么使用?首先,如果要访问上面假设的aa[0] 那么使用 a[0][0] ,要访问 ab[0] 使用 a[1][0] ,好了,下标访问解决了,那这就行了吗?不行,还有指针啊,一维数指可以用指针来操作,那二维数组呢?当然也可以……int a[2] ,是一个一维数组,它存储了两个 int 型。每个 int 型 使用 sizeof(int) 得出,占用四个字节。那么 sizeof(a[0]) 等于4 ,sizeof(a)等于 sizeof(a[0]) 乘以 2 等于 8。也就是说,使用 int 指针,偏移两次(每次4字节),就可以操作这个数组的值。而在 int a[2][3] 里,a[0] 还是占用4字节吗?当然不是,前面说过,它的每个元素包含了另外一个数组,这时候的 a[0] 占用了 sizeof (a[0]) 等于 int (4字节) 乘以 3 等于 12字节……使用 int 型指针 每次++只能偏移 4 个字节,而我们现在需要的是 从 a[0] 偏移到 a[1] --12个字节,那怎么办? int(4字节) 乘以 3,所以定义 int (*p)[3],注意这里,不是使用 int *p[3],而是使用int (*p)[3],为什么要个括号?因为,int *p[3],定义的是一个指针数组,它可以这么用:int a,b,c,*p[3]; p[0]=&a;p[1]=&b;p[2]=&c,那么我们p[n]实施++操作的时候,它一样的只是偏移4个字节。而 int (*p)[3],就不同了,它是一个数组指针,每次对它进行++操作时,它正确的偏移了12个字节。好了,现在可以这么使用指针了,int a[2][3],(*p)[3];p=a;p++; 可以从a[0]偏移到a[1]了,但是,要取得a[0][0]的值怎么办呢?前面说过,这个a是数组的数组,意味着a[0] 值是另一个数组的首地址,所以我们可以使用 int 型指针,来把 a[0] 当做一个一维数组来操作了。int *pp;pp=*p(注意,是pp=*p,而不是pp=p ,p的值是这个二维数组a的首地址,*p的值就是a[0]的值,存储的是 包含三个元素的 数组首地址。)那么,pp++,int 型 偏移 4 字节 ,能正常读取了,顺理成章~~~:)那如果int [2][3][4]呢?不说啦,思路延伸一下就行了。
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网