c/c++语言开发共享传递一个常数矩阵

提到这个问题,特别是litb接受的答案 ,我想知道为什么gcc抱怨这个:

void func(const int (*ip)[3]) { printf("Value: %dn", ip[1][1]); } int main() { int i[3][3] = { {0, 1, 2} , {3, 4, 5}, {6, 7, 8} }; func(i); return 0; } 

如果我消除了const ,编译器会保持静止。 我有什么误会吗? 我想确保func不修改我的数组。

编辑:如果我为我的矩阵定义数据类型,会发生同样的事情:

 typedef int Array[3][3]; void func(const Array *p) { printf("Value: %dn", (*p)[1][1]); } int main() { Array a = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} }; func(&a); return 0; } 

我接受,这种代码不是很C风格,更像是C ++。 在C ++中,如果我将Array定义为包含所有矩阵行为的类,确实没有问题。

 class Array {...}; 

我想,我不太了解C中数组和数组数组的概念,并将它们传递给函数。 任何启示?

先感谢您。

EDIT2:同时我对这个问题略微嗤之以鼻 ,它似乎收敛到了以下问题:C / C ++隐式地将指向int的指针转换为指向const int的指针。 因此以下工作:

 func(const int a[]) // aquivalent: func(const int *a) { ... } int main() { int b[10]; func(b); return 0; } 

但是,C / C ++不会将指向n int s数组的指针隐式转换为指向n const int s数组的指针。 即使n int的数组被隐式转换为n const int的数组。 不支持隐式转换中的这种间接级别。 以下内容将被拒绝(至少在C中有警告):

 func(const int a[][n]) // aquivalent: func(const int (*a)[n]) { ... } int main() { int b[m][n]; func(b); return 0; } 

它类似于C ++不会隐式地将类型A的模板转换为类型B的模板的问题,即使A可以隐式转换为B.这两个模板的类型完全不同。

这是正确的答案吗?

    你的i变量是一个包含3个元素的数组。

    当您将它传递给函数时,在函数内部,它将成为指向第一个元素的指针。 编译器可以将const添加到指针或指向的东西: 3个整数的数组 。 然而,它不能将从3个int 的数组指向的东西改变为3个常量的数组

    我想你需要自己做演员。

     #include  typedef const int array_of_3_constants[3]; void func(int (* const i)[3]) { ++i[0][0]; printf("Value: %dn", i[1][1]); } void gunc(array_of_3_constants *i) { ++i[0][0]; /* error */ printf("Value: %dn", i[1][1]); } int main(void) { int i[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; func(i); func((array_of_3_constants*)i); /* warning */ gunc(i); /* warning */ gunc((array_of_3_constants*)i); return 0; } 

    您不需要消除const,只需通过在func调用中转换参数来传递兼容值:

         func((void *)i); 

    如果可能的话,最好将i声明为const,但这个hack应该可行。

      以上就是c/c++开发分享传递一个常数矩阵相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559997.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐