[英]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
傳遞給函數array[0]
)的地址還是我傳遞第一個變量(array[0][0]
)的地址?
您正在傳遞一個指向array
array[0]
的第一個元素的指針,該元素本身就是一個數組。 該指針的值與指向array[0][0]
的指針相同,但類型不同。 實際上,您的代碼是不正確的,因為參數的類型和函數參數的類型不一致,但是只要類型int(*)[]
和int *
具有相同的表示形式,則重新解釋將在實踐中起作用。
至於
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
}
將數組傳遞給函數時,使用的是“按引用傳遞”,這意味着您傳遞了數組的地址。
否。當前傳遞數組的方式是為函數提供二維數組。
否。您仍然需要指定要從ar [0]打印的數字。
這是因為您要告訴程序轉到內存中的數組,然后使用指針算術遍歷數組。 例如,如果您有一個包含字符abcde\\0
的char * str
變量,並且想讓該字符位於位置2,則可以執行str[2]
或*(str+2)
,這意味着相同的事情,並且兩者都給出字符'c'
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.