【问题标题】:Pointer to a pointer (2D array) as input parameter指向作为输入参数的指针(二维数组)的指针
【发布时间】:2016-03-19 06:34:03
【问题描述】:

我 2 个月前开始在大学学习 C++,我试图弄清楚如何将动态二维数组(指向指针的指针)作为输入参数传递给函数。 我有这个动态二维数组:

int **p;
p = new int*[R];
for(i=0; i<R; i++)
    p[i] = new int[C];

现在我想使用 const 将此指针 p 作为输入参数传递给函数。我的意思是我希望函数不能修改矩阵的元素。

我试过这样:

void func(const int **p) {
}

但我得到这个错误:

main.cpp:19:11: 错误:从 'int**' 到 'const 的无效转换 int**' [-fpermissive]

main.cpp:9:6: 错误:初始化 'void func(const int**)' [-fpermissive] 的参数 1

我尝试使用 typedef 并且它可以工作,但它不是恒定的。 如果我喜欢这样:

typedef int** abc;

void func(const abc p);

main() {
abc p;
...
func(p);
}

源代码编译但函数'func'能够修改“p矩阵”的值;我希望 p 是一个输入参数,它必须是只读的!

请问,如何将指针传递给将元素标记为只读的函数?

提前感谢您的帮助,并为我的英语不好感到抱歉。

【问题讨论】:

    标签: c++ arrays pointers parameters constants


    【解决方案1】:

    试试这个:

    typedef const int *cint_ptr_t  ;
    
    void func(const cint_ptr_t  *p) {
    }
    

    请记住,您希望 const 二维数组的元素指向每行开头的指针

    【讨论】:

      【解决方案2】:
      void func(const int * const *p) {
      }
      

      【讨论】:

      • 能否请您也给我一个简短的解释?非常感谢。
      【解决方案3】:

      您的const int **p 应该是const int * const *p。从const int **int ** 的转换不允许是隐式的,因为它可能违反所指向值的常量。要了解原因,请查看以下从 C 标准(第 6.5.16.1 节)中摘录的代码:

      const char **cpp;
      char *p;
      const char c = 'A';
      
      cpp = &p;       // constraint violation
      *cpp = &c;      // valid
      *p = 0;         // valid
      

      如果cpp = &amp;p 是有效赋值,则后续代码将能够将c 的值设置为0,尽管该值是const char

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2017-06-11
        • 2015-01-12
        • 2012-01-26
        相关资源
        最近更新 更多