簡體   English   中英

多維數組對C的理解

[英]Multidimensional arrays understanding for c

我有一個關於將數組傳遞給另一個函數的問題。

#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]?

提前謝謝大家!

如果要將二維數組傳遞給函數:

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

該函數的聲明必須匹配:

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

要么

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

作為數組的數組的2D數組會衰減指向數組的指針,而不是指向指針的指針。

因此,假設[I]是否將array傳遞給函數print 我傳遞第一個一維數組( array[0] )的地址還是我傳遞第一個變量( 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)的含義。

您的代碼可能沒有執行您想要的操作。 使用Wall編譯,您將看到一些警告。

您需要更改print參數以接受2D數組(現在您正在傳遞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
}

將數組傳遞給函數時,使用的是“按引用傳遞”,這意味着您傳遞了數組的地址。

  • 我是傳遞第一個一維數組的地址(array [0])還是剛傳遞了第一個變量的地址(array [0] [0])。

否。當前傳遞數組的方式是為函數提供二維數組。

  • 至於打印功能,在這種情況下,我是否正確地說是通過打印ar [0]來打印array [0] [0]?

否。您仍然需要指定要從ar [0]打印的數字。

  • 但是,為什么在打印*(ar + 1)的情況下,我實際上是在打印array [0] [1]而不是array [1] [0]?

這是因為您要告訴程序轉到內存中的數組,然后使用指針算術遍歷數組。 例如,如果您有一個包含字符abcde\\0char * str變量,並且想讓該字符位於位置2,則可以執行str[2]*(str+2) ,這意味着相同的事情,並且兩者都給出字符'c'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM