二维数组与指针,
#include <iostream>using namespace std;
void Func1(int **c, int a, int b)
{
cout<<c[0][0]<<endl;
cout<<c[1][0]<<endl;
}
void main ()
{
int i;
int *a = new int[2*3];
int **p = &a;
for(i=0; i<2*3; i++) {
a[i] = i;
}
Func1(p, 2, 3);
}
编译运行, 如果你像我一样运气好的话, 程序不会崩溃, 你会得到一组数字:
0
3436320
如果定义a[2][3]这样的二维数组, 我们在使用的时候编译器会将a[x][y]采用形如p+3*x+y的寻址方式, 因为编译器知道我们的一行是3个元素.
在Func1函数里, 传入的是双重指针, 接收的是**p也是双重指针, 可是使用的时候呢? 上面的是错误的示例, 因为在函数内部编译器不知道你这个数组是几行几列的.
它没法将c[x][y]转换成p+3*x+y的寻址方式. 所以我需要同时传入两个额外的参数a和b来表示数组的行列, 在使用的时候我就可以手动将c[x][y]转换成p+a*x+y, 再加上取值符号就可以取出正确的值: *(p+a*x+y)
实际上如果你使用c[x][y]这样的形式(如上面的程序), 编译器不会报错, 但是你运行的时候, 就有很大的几率崩溃, 因为编译器将行列错误的进行了解析.
这时编译器是这样编译的:
它取出c[x]作为行的首地址, 再加上y.
由于c[0]一定是传入数组的首地址, 所以c[0][y]这样的访问都是OK的, 只要你不越界.
c[1]我们就不知道是个什么东西了, c[1][y]这样的访问就是一个随机数, 当访问到无法访问的地方时, 程序就会崩溃.
红色的话希望能解释下好么,谢谢