关于二级指针为函数参数的探讨
时间:2010-08-09 来源:westmylove
最近在写一个程序的时候用到了二级指针作为函数参数的情况,就在函数内部如何操作二级指针为数组做以下探讨:
无非有两种使用方式 a[i][j] or *((type *)a + i*col + j);
先看下面的测试源码:
#include <iostream> |
原因分析:
1. Pass: 由于 **a 是之前new动态分配的,在分配内存时,系统已经记忆了列数,因此可以直接使用 a[i][j] 而不会有问题;
2. Error: 由于 a_1[5][5] 为直接定义的,非动态分配,系统不清楚列数,因此使用a_1[i][j] 是会出现错误的;必须采用4的方式,指定列数 指针操作实现;
3. Error: 由于在动态分配a时,a[i][0]~a[i][col] 地址是连续的,但是 a[0] a[1]…地址并不是间隔col*sizeof(type)的,所以指针操作时,必定指向错误的地址;以下地址仅供参考:
&a 0x003b6ff8
&a[0] 0x003b7048
&a[1] 0x003b7228
&a[2] 0x003b7290
&a[3] 0x003b72f8
&a[4] 0x003b7360
&a[0][0] 0x003b7048
&a[0][1] 0x003b7050
&a[0][2] 0x003b7058
&a[0][3] 0x003b7060
&a[0][4] 0x003b7068
&a[1][0] 0x003b7228
可以看到:
a[0][0]~a[0][4]之间是相差8个字节的;
a[1]与a[2]之间相差104个字节,比我想象的8*5 多64个字节;
可以参照:http://blog.chinaunix.net/u1/57478/showart.php?id=2293698
具体64怎么来的,这个没算出来。。。有知道的朋友指教下。
4. Pass: 具体参考http://hi.baidu.com/weijiel/blog/item/a674e509931eb48ad1581b90.html
即,在保证二维数组是由动态分配时,函数中可以直接按照数组的方式访问,不然则必须指针操作。