如何使用指针而不是数组

时间:2015-07-22 17:36:05

标签: c++ arrays pointers

我已经完成了这段代码(至少):

int** constructSparseMatrix(int totalRow, int totalCol, int totalEl) {
    int** arr = new int*[totalEl];
    //int x = 0;
    for(int i = 0; i < totalEl; i++) {
        arr[i] = new int[totalCol];
        for (int k = 0; k < totalCol; k++) {
            if(k == totalCol - 1) {
                arr[i][totalCol - 1] = rand () % 101;
            } else {
                arr[i][k] = rand () % totalRow + 1;
            }
        }
    }
    return arr;
}

我试图通过使用指针而不是数组来访问内部元素,这是我的尝试:

int** constructSparseMatrix(int *totalRow, int *totalCol, int totalEl) {
    int** arr = new int*[totalEl];
    //int x = 0;
    for(int i = 0; i < totalEl; i++) {
        arr[i] = &totalCol [0];
        for (int k = 0; k < *totalCol; k++) {
            if(k == *totalCol - 1) {
                arr[i][*totalCol - 1] = rand () % 101;
            } else {
                arr[i][k] = rand () % *totalRow + 1;
            }
        }
    }
    return arr;
}

但是当我以与工作函数相同的方式初始化时:

int** arr = constructSparseMatrix(5,3,totalEl);

然后我收到此错误:

argument of type "int" is incompatible with parameter of type "int *"

首先,我从数组到指针版本的转换是否正确编码?如果它是正确的,我如何初始化它以避免上述错误?

2 个答案:

答案 0 :(得分:1)

首先,很明显这个语句在函数中

arr[i] = &totalCol [0];

错了。这没有意义。

您宣布了该功能

int** constructSparseMatrix(int *totalRow, int *totalCol, int totalEl);

将第一个和第二个参数作为指针但是试图在调用中将整数文字5和3传递给它

int** arr = constructSparseMatrix(5,3,totalEl);

你可以写例如

int totalRow = 5;
int totalCol = 3;

// ...

int** arr = constructSparseMatrix( &totalRow, &totalCol, totalEl );

但是我没有看到将这些参数声明为指针的意义,因为它们实际上是函数中的常量,它们不会被更改。

变量名称使读者感到困惑。例如,我希望在语句

中的函数中使用totalRow
int** arr = new int*[totalRow];

而不是totalEl

如果你想在函数中使用指针,那么函数可能看起来像

int** constructSparseMatrix( int totalRow, int totalCol, int totalEl ) 
{
    int** arr = new int*[totalEl];

    for ( int **p = arr; p < arr + totalEl; ++p ) 
    {
        *p = new int[totalCol];
        for ( int *q = *p; q < *p + totalCol; ++q ) 
        {
            if ( q == *p + totalCol - 1 ) 
            {
                *q = rand () % 101;
            } 
            else 
            {
                *q = rand () % totalRow + 1;
            }
        }
    }

    return arr;
}

答案 1 :(得分:0)

我认为您将常量5和3作为参数传递,从而导致此错误。 你不能通过引用传递常数值。尝试通过将它们存储在变量中来传递5和3。