【问题标题】:how to loop through a 2d array in pointers notation and array notation如何以指针表示法和数组表示法循环遍历二维数组
【发布时间】:2015-04-30 01:46:59
【问题描述】:

我是 C++ 新手,所以我问了一个简单的问题,但我似乎找不到答案。 我正在尝试编写一个函数来打印二维整数数组的所有元素并打印其内容。我正在尝试使用指针表示法使用数组表示法来做到这一点。我不知道要向指针表示法的方法发送什么。到目前为止,这是我的代码:

#include <iostream>
using namespace std;


void arrayNotation(int array[][4], int row){
    for (int i = 0; i < row; i++){
        for (int j = 0; j < 4; j++){
            cout << array[i][j];
        }
        cout << "\n";
    }
    cin.get();
}
void pointerNotation(){//i dont know what to send it
    for (int i = 0; i<4; i++){
        for (int j = 0; j<4; j++){
            cout << (*(*(array + i) + j));
        }
    }

}
int main(){     
    int array[2][4] = { { 467, 223, 189, 100 }, { 222, 561, 489, 650 } };
    arrayNotation(array, 2);
    pointerNotation();//how do you send it in to be pointer notation?

    return 0;
}

谢谢!

【问题讨论】:

    标签: c++ arrays loops pointers


    【解决方案1】:

    你需要的是

    void pointerNotation(int (*array)[4]) // pass pointer to array-of-4 ints
    

    但上面的其实和int array[][4]是一样的,因为后者只是语法糖。

    请注意,您不能这样做

    void pointerNotation(int**)
    

    因为int[][4] 不会衰减到int**。后者更灵活,前者只是一个指向arrays-of-4-ints的指针。

    【讨论】:

    • 当你说“但上面的内容实际上与 int array[][4] 相同,因为后者只是语法糖。” , 你是什么意思?只是在指针表示法中是一样的吗? (*array)[4] 是如何成为二维数组的?
    • int* 在用作函数参数类型时与int[] 相同。类似地,int (*array)[4] 是指向 int[4] 类型变量的指针的符号,即指向 4 个整数数组的指针,它的语法糖就是 int array[][4]。如果你增加指针,那么你“跳过”了 4 个元素,所以基本上它代表一个二维数组。也就是说,*(array+i) 指向第i 行,因此进一步取消引用它*(*(array+i)+j) 是位于二维数组中位置[i][j] 的元素。
    • 哦,我明白了。所以通过放入 int (*array)[4] - 是什么使它成为指针符号?
    • @programmingGirl 是的,它明确使用指针表示法。但同样,在内部没有区别。这与编写f(int*)f(int[]) 时的情况完全相同。两者都是完全等价的声明。
    • 非常感谢。这行得通。所以通过我做数组表示法和指针表示法,我得到了相同的答案。但理论上到底有什么区别?
    【解决方案2】:

    我更喜欢显式传递行数和列数。这样,一种方法可能如下。

    void pointerNotation(const int * const pArray, const int ROWS, const int COLS) { 
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                const int offset = i * ROWS + j;
                cout << *(pArray + offset);   // or pArray[offset]
            }
        }
    }
    

    调用为

    pointerNotation(array, 2, 4);
    

    【讨论】:

    • 但我认为我们不应该使用 const。我们只需要使用指针表示法
    • const 保证这些值是只读的,它与指针无关。如果你愿意,你可以省略它们,对于这个问题,它没有任何区别。
    • 这确实是一种替代方法,但使用的是“平面”数组。也许这就是@programmingGirl 想要的。
    • 我明白了。我的问题是,因为你发送了 row 和 col 你只需要做 int * pArray 而不是 int * pArray[4]?
    • 是的,int * pArray 就足够了。正如@vsoftco 提到的,在这种方法中,我们将二维数组扁平化为一维数组。事实上,计算机内存是线性的,这就是二维数组在内存中的存储方式。
    【解决方案3】:

    您也可以设置二维数组并以两种不同的方式发送它们。

    #include <iostream>
    
    using namespace std;
    
    void pointerNotation(int (*array)[4]){//i dont know what to send it
        for (int i = 0; i<2; i++){
            for (int j = 0; j<4; j++){
                cout << (*(*(array + i) + j)) << " ";
            }
            cout << endl;
        }
    
    }
    
    void pointerNotation2(int **array){//i dont know what to send it
        for (int i = 0; i<2; i++){
            for (int j = 0; j<4; j++){
                cout << (*(*(array + i) + j)) << " ";
            }
            cout << endl;
        }
    }
    
    int main(){     
        int array[2][4] = { { 467, 223, 189, 100 }, { 222, 561, 489, 650 } };
    
        int **array2 = new int*[2];
        for (int i = 0; i < 2; i++) {
            *(array2 + i) = new int[4];
        }
    
        // copying for second array
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 4; j++) {
                *(*(array2 + i) + j) = *(*(array + i) + j);
            }
        }
    
        pointerNotation(array);
    
        pointerNotation2(array2);
    
        return 0;
    }
    

    输出

    467 223 189 100 
    222 561 489 650 
    467 223 189 100 
    222 561 489 650 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2013-05-20
      • 2021-11-13
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多