逛奔的蜗牛

我不聪明,但我会很努力

   ::  :: 新随笔 ::  ::  :: 管理 ::
array[3][3],这时,array占有9个连续的内存单元,地址是连续的,如果真可以直接简单的传给指向指针的指针的,则二维指针取下一个元素地址就是简单的加法了,但是如果传入的指针是int** p; p = new int*[3];呢?
for (int i = 0; i < 3; i++) {
        *(p + i) = new int[3];
}
这时二维指针p的元素占有的9个内存单元却不能保证是连续的(只能保证有每行的3个是连续的),取下一行地址时,就不能如上面的那样简单的直接相加了(上一行末元素的地址直接加4),所以得传入一个指向指针的指针才行,如int* p[3](存储的是每行的指针)或者int** p,为p初始化,分配空间;
所以int** p 和int p[row][column]绝对不是一回事。

像下面这样可以正确运行:
#include <iostream>
#include <stdio.h>
using namespace std;
void func(int** array, int row, int column) {
         for (int i = 0; i < row; i++) {
                for (int j = 0; j < column; j++) {
                        cout << *(*(array+i) + j) << "\t";
                }
                cout << endl;
        }
}

int main(){
        int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        
        int* p[3];
        p[0] = array[0];
        p[1] = array[1];
        p[2] = array[2];
        
        func(p, 3, 3); // 如果这里传入array, array[0], &array[0][0],则编译不通过
        // 传入int* q = array[0]; int** p = &q;编译通过,但运行时要么错退出,要么输出的结果是错的。
        
        return 0;
}
posted on 2010-12-17 17:52 逛奔的蜗牛 阅读(611) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理