【问题标题】:Multidimensional arrays understanding for cc语言的多维数组理解
【发布时间】:2015-09-02 13:34:02
【问题描述】:

我有一个关于将数组传递给另一个函数的问题。

#include <stdio.h>
void print (int ar[]);

main () {
    int array[2][2] = {1,2,3,4};
    print(array);
}

void print (int ar[]) {
    printf("%d\n", ar[0]);
    printf("%d\n", *(ar+1));
}

假设我将数组传递给函数 print。我是在传递第一个一维数组(array[0])的地址,还是只是传递第一个变量的地址(array[0][0])。

至于打印功能,在这种情况下,我是否正确地说通过打印 ar[0],我正在打印 array[0][0]?

但是为什么在打印*(ar+1)的情况下,我实际上打印的是array[0][1]而不是array[1][0]?

提前谢谢大家!

【问题讨论】:

  • 您是否尝试过编译,例如对于 gcc,-Wall
  • 这给出了一个警告。编译看看。
  • 你有没有经过this question?你应该! :)
  • 谢谢 NTN。这是帮助理解多维数组的一个非常好的页面!

标签: c arrays function multidimensional-array


【解决方案1】:

如果您将二维数组传递给函数:

int array[NROWS][NCOLUMNS];
print(array);

函数的声明必须匹配:

void print(int array[][NCOLUMNS])
{ ... }

void print(int (*ap)[NCOLUMNS]) /* ap is a pointer to an array */
{ ... }

二维数组是数组的数组,衰减指向数组的指针而不是指向指针的指针。

【讨论】:

    【解决方案2】:

    假设 [I] 将 array 传递给函数 print。我是在传递第一个一维数组的地址 (array[0]) 还是 [I] 只是传递了第一个变量的地址 (array[0][0])。

    您正在传递一个指向array 的第一个元素array[0] 的指针,它本身就是一个数组。该指针与指向array[0][0] 的指针具有相同的值,但类型不同。实际上,您的代码是不正确的,因为参数的类型和函数参数的类型不一致,但只要类型 int(*)[]int * 具有相同的表示形式,重新解释将在实践中起作用。

    至于print函数,在这种情况下,我是否正确地说通过打印ar[0],我正在打印array[0][0]

    是的,当您像在示例中那样调用 print() 时,只要类型表示与上述一致。

    但是为什么在打印*(ar+1)的情况下,我实际上打印的是array[0][1]而不是array[1][0]

    因为ar 是指向array 的第一个元素的指针,即一维数组array[0]。它的元素是array[0][0]array[0][1]等。因此ar + 1是指向array[0]的第二个元素的指针,即array[0][1]

    您有两个选项可以使您的代码正确,这两个选项都可能有助于澄清所涉及的问题。您可以更改传递给print() 的参数以同意该函数:

    print(array[0]);
    

    或者,您可以更改print() 参数的声明类型,并对其使用进行相应的更改:

    void print(int (*ar)[2]) {
        printf("%d\n", ar[0][0]);
        printf("%d\n", *(ar+1)[0]);
    }
    

    void print(int ar[][2]) {
        printf("%d\n", ar[0][0]);
        printf("%d\n", *(ar+1)[0]);
    }
    

    后两者改变了*(ar + 1)的含义。

    【讨论】:

    • void print(int (*)[*])?
    • 很好地回答了这个问题,而不是仅仅告诉操作人员他们代码中的错误。 +1
    • @EOF,是的,如果您不受 C90 合规性要求的限制,那也应该可以。我想这对大多数人来说不是问题。
    • @EOF,或者至少它适用于参数协议。如果您希望能够评估 ar + 1,则它不起作用,因为这需要 *ar 具有固定的、静态已知的大小。
    • 感谢@JohnBollinger 的帮助。所以本质上,我将错误的类型传递给 print 函数。
    【解决方案3】:

    您的代码可能没有按照您的意愿行事。使用Wall 编译,你会看到一些警告。

    您需要更改print 参数以接受二维数组(现在您正在传递int (*)[2],但该函数需要int *),然后您可以正确打印这些值。

    #include <stdio.h>
    void print (int ar[][2]);
    
    int main () {
        int array[2][2] = {
            {1,2},
            {3,4}
        };
        print(array);
        return 0;
    }
    
    void print (int ar[][2]) {
        printf("%d\n", ar[0][0]); // 1
        printf("%d\n", ar[1][0]); // 4
    }
    

    【讨论】:

      【解决方案4】:

      当您将数组传递给函数时,您使用的是“按引用传递”,这意味着您传递数组的地址。

      • 我是在传递第一个一维数组 (array[0]) 的地址,还是只是传递第一个变量 (array[0][0]) 的地址。

      没有。您当前传递数组的方式是为函数提供二维数组。

      • 至于打印功能,在这种情况下,我是否正确地说通过打印 ar[0],我正在打印数组 [0][0]?

      没有。您仍然需要指定要从 ar[0] 打印的数字

      • 但是为什么在打印*(ar+1)的情况下,我实际上打印的是array[0][1]而不是array[1][0]?

      这是因为你告诉程序去内存中的数组并使用指针算法来遍历数组。例如,如果您有一个包含字符 abcde\0char * str 变量,并且想要获取位置 2 的字符,您可以执行 str[2]*(str+2),这意味着相同的事情,并且都给出字符 'c' .

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2020-09-29
        • 2016-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多