gpt4 book ai didi

c - 传递常量矩阵

转载 作者:太空狗 更新时间:2023-10-29 15:37:12 26 4
gpt4 key购买 nike

引用this问题,尤其是接受的answer litb,我想知道为什么 gcc 会提示这个:

void func(const int (*ip)[3]) {
printf("Value: %d\n", 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: %d\n", (*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++ implicitly converts a pointer to an int to a pointer到 const int。因此,以下工作:

func(const int a[]) // aquivalent: func(const int *a)
{ ... }

int main()
{
int b[10];
func(b);
return 0;
}

但 C/C++ 不会将指向 n 个 int 数组的指针隐式转换为指向 n 个 const int 数组的指针。即使 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 个整数的数组 更改为3 个常量的数组

我认为您需要自己进行转换。

#include <stdio.h>

typedef const int array_of_3_constants[3];

void func(int (* const i)[3]) {
++i[0][0];
printf("Value: %d\n", i[1][1]);
}

void gunc(array_of_3_constants *i) {
++i[0][0]; /* error */
printf("Value: %d\n", 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;
}

关于c - 传递常量矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1340189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com