首页 > 解决方案 > 为什么我的函数无法使用指针打印多维数组的元素?

问题描述

我有一个 3 X 3 多维数组,我想使用指针打印第 0 行的所有 3 个元素。

这是我写的代码:

#include <iostream>

void print(int *p){
    for(int i = 0; i < 3; i++){
        std::cout << (*p)[i];
    }
};


int main(void){
    int arr[3][3] = {
        {1,2,3} ,
        {4,5,6} ,
        {7,8,9}
    };
   print(arr);
}

这会引发以下错误:

Main.cpp:5:26:错误:下标值不是数组、指针或向量

std::cout << (*p)[i];
                 ~~~~^~

Main.cpp:16:4:错误:没有匹配的函数调用“打印”

print(arr);
   ^~~~~

Main.cpp:3:6:注意:候选函数不可行:第一个参数没有从 'int [3][3]' 到 'int *' 的已知转换

void print(int *p){

据我了解,arr是指向数组的第一个元素的指针,该元素本身就是一个数组。那么为什么我找不到指针arr返回的值的数组 [i]呢?

标签: c++arrayspointersmultidimensional-array

解决方案


数组的第一个元素arr有 type int[3]。因为所谓的二维数组在语言上就是数组的数组

因此arr不能是 的等价物int*,只能是int[][3]或的等价物int(*)[3]

void print(int p[][3]){
    for(int i = 0; i < 3; i++){
        std::cout << p[0][i];
    }
};

或者

void print(int (*p)[3]){
    for(int i = 0; i < 3; i++){
        std::cout << (*p)[i];
    }
};

将是您的功能的正确签名。任何将多维数组表示为指针的尝试都需要显式转换并将其洗回函数内的正确类型,否则将被视为未定义行为,即使大多数实现都允许这样做。


推荐阅读