【问题标题】:Two Dimesional array in CC中的二维数组
【发布时间】:2013-10-05 15:35:30
【问题描述】:

我试图将指针值作为参数传递给二维数组,但它不起作用?这是一个例子:

void Pass(char *ch) // <--------- Where's I'm getting the error
{}

int main(...)
{
    char ch[5][5];
    Pass(ch);
}

我应该如何正确传递它作为指向二维数组的参数?

【问题讨论】:

  • 请发布您的错误。变量名本身应该指向第一个元素,所以ch == &amp;ch[0][0]

标签: c codeblocks


【解决方案1】:

在 C 中,指向二维数组的指针与指向一维数组的指针基本相同,当作为指针传递时,二维数组的原始大小会丢失(在您的情况下为 char*)。

您可以使用明确的尺寸定义来定义您的 Pass 函数:

void Pass(char ch[5][5]) {...}

或将尺寸作为附加参数传递:

void Pass(char* ch, int size_x, int size_y) {...}

第二个选项更具动态性,但需要更加谨慎。 要访问 (x,y) 处的数组,请使用以下公式:

ch[size_y * x + y]

虽然传递size_x 可能看起来多余,但您需要将x0 限制为size_x-1,并将y0 限制为size_y-1

【讨论】:

  • @mvp 不要教我 C!我知道指针指向指针与二维数组不同。而且我也不是在谈论指针到指针。 似乎不知道可以像这样定义可变长度数组:size_t x; x = some_value(); int arr[x];。这与 malloc()ating 每一行的内存不同。
  • @H2CO3 哼,没想到 &arr[0][0]。不错。
  • @mvp 您应该阅读 C99 和 C11 标准。我们不再生活在 1989 年。
  • @mvp 自 C99 起允许使用可变长度数组。 ANSI C 不是当前的 C 标准,C11 是。
  • @mvp C11,不是 C++11。不,如果它没有被标记为“C89”,我们可以假设使用当前标准。
【解决方案2】:

数组到指针的衰减规则不是递归的。在 main() 内部,ch 是 char (*)[5] 类型,即指向 5 个字符数组的指针。 Pass() 需要一个指向 char 的指针,因此会出现错误。

因此,Pass() 应声明为接收字符 (*ch)[5]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多