c++访问2D数组指针上的值

C++ Accessing Values at pointer of 2D Array

本文关键字:指针 数组 访问 2D c++      更新时间:2023-10-16

我需要一个动态的二维整数数组,它将代表一个标准矩阵。在运行时从文件中读取大小和元素。

从其他堆栈帖子的方向,我已经设置了我的数组如下;

void buildArray(ifstream &file, int** 2dArray);
void buildQueue(Queue<int> &Q, int** 2dArray);
int main()
{
    int** 2dArray;
    Queue<int> Q;
    //...
    // open file
    //...
    buildMatrix(file, 2dArray)
    buildQueue(Q, 2dArray)
}
void buildArray(ifstream &file, int** 2dArray)
{
    int size, element;
    while (file.good()) {
        file >> size;
        2dArray = new int*[size];
        for (int i = 0; i < size; i++)
            2dArray[i] = new int[size];
        // now I should be able to use 2dArray[r][c]
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                file >> element;
                2dArray[i][j] = element;
            }
        } 
}

然后我需要读取存储在每个位置[r][c]的整型数,并建立一个队列。我认为我的问题是取消引用指针…但我不确定。

void buildQueue(Queue<int> &Q, int** 2dArray)
{
    int row, column, element;
    // size is passed in as well, size is our rows or columns size here
    for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                row = i;
                column = j;
                element = 2dArray[i][j];   // getting seg fault here!
                Q.push_back(row, column, element);
            }
     }
 }

我应该补充一点,我知道我可以用向量。我在这里挑战自己,负责任地构建,使用和释放使用指针的2D数组。

什么是table?

table = new int*[size];

应该是

2dArray = new int*[size];

也返回函数

的指针

改变
void buildArray(ifstream &file, int** 2dArray)

int ** buildArray(ifstream &file)

,否则buildArray将获取该变量的副本。这个副本现在保存着指向分配内存的指针。调用函数中的指针永远不会更新。

在原始代码中,在buildArray调用之前和之后添加printf 2dArray。

printf("%p, 2dArray);
buildMatrix(file, 2dArray);
printf("%p, 2dArray);

你会看到2dArray没有改变。你实际上是在传递一个未初始化的指向buildQueue.

buildArray和call应该这样修改

void buildArray(ifstream &file, int** arr)
{
    int size, element;
    while (file.good()) {
        file >> size;
        arr = new int*[size];
        for (int i = 0; i < size; i++)
            arr[i] = new int[size];

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                file >> element;
                arr[i][j] = element;
            }
        }
    }
    return arr;
}
int main()
{
    int** 2dArray;
    Queue<int> Q;
    //...
    // open file
    //...
    2dArray = buildMatrix(file);
    buildQueue(Q, 2dArray);
}

如果在函数内部分配初始数组,则需要将其作为三重指针传递并更改为:

*2dArray = new int*[size]

或返回int**

否则将丢失指向新内存的指针。

别忘了,指针是按值传递的。实际上,在调用buildArray()之后,您仍然没有指向有效内存的指针。

当你在函数中分配一个参数传递的指针时,你只改变了复制值。在C/c++中,当你向一个函数发送参数时,会创建这个参数的副本。所以,像其他的答案之前说过,有可能返回指针的新值改变你的void buildArray(...)int** buildArray(...)或在你的指针上发送一个指针(这看起来很难),或者最后,你在c++所以你可以发送一个引用,void buildArray(ifstream &file, int**& 2dArray)也2array将是真正的指针从主,你应该改变他的值,而不改变你的代码。