我有這樣的代碼,我正在努力理解。 它可以很容易地運行/作業,以列印多維陣列的所有元素
。正確
#include <stdio.h>/span>
void print(int *arr)
{
int i, j;
for (i = 0; i < 3; i )
for (j = 0; j < 3; j )
printf("%d", *((arr i*n) j) )。
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}。{7, 8, 9}}。
int m = 3, n = 3;
print((int *)arr, m, n);
return 0;
}
但是,如果我的列印函式是這樣的
錯誤的。
錯誤的 還有像這樣的main 我得到這些警告 我以前也問過類似的問題,有人提到在某些計算機的架構中不允許使用可變大小的陣列,但我在SO上找不到這個問題。所以誰能詳細說明一下這意味著什么?
另外,如果我在main中擁有多維陣列,那么用陣列處理它們的其他方法是什么,我可以使用指標陣列嗎,誰能給我一個指標陣列的例子,以完成我正確的例子中的代碼示例#include <stdio.h>
void print(int **arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i )
for (j = 0; j < n; j )
printf("%d", *((arr i*n) j) )。
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}。{7, 8, 9}}。
int m = 3, n = 3;
print(arr, m, n);
return 0;
}
pointers2. c:7:18: warning: format '%d' expects argument of type 'int, but argument 2 has type 'int *' [-Wformat=]
7 | printf("%d", *((arr i*n) j) )。
| ~^ ~~~~~~~~~~~~~~~~
| | |
| int int *
| %ls
pointers2.c: 在函式'main'中。
pointers2.c:14:11: warning: 傳遞引數1的'print' 來自不兼容的指標型別 [-Wincompatible-pointer-types]
14 | print(arr, m, n)。
| ^~~
| |
| int (*)[3]
pointers2.c:2:18: note: 預期'int **' 但引數是'int (*) [3] 的型別。
2 | void print(int **arr, int m, int n)
一個int(*)[3]并不是一個int**。你可能想要一個int*,你可以通過獲取2D陣列中第一個元素的地址來得到它。
示例:
#include <stdio.h>/span>
void print(int *arr。int m, int n) { / int*
int i, j;
for (i = 0; i < m; i ) {
for (j = 0; j < n; j )
printf("%d", *((arr i*n) j))。
putchar('
')。
}
}
int main(); }
{
int arr[][3] = {{1, 2, 3}。{4, 5, 6}, {7, 8, 9}}。
int m = 3, n = 3;
print(&arr[0][0], m, n); // take the address of the first int in the array.
return 0;
}
注意:越界訪問內部陣列會使你的程式產生未定義的行為--但是它可能會作業,因為陣列在記憶體中必須是連續的。
uj5u.com熱心網友回復:
傳遞一個任意大小的二維陣列的正確方法是使用可變長度陣列作為引數。
#include <stdio.h>/span>
void print(int m。int n, int arr[m][n]) {
int i, j;
for (i = 0; i < m; i ) {
for (j = 0; j < n; j )
printf("%d"/span>, arr[i][j])。
putchar('
')。
}
}
int main(); }
{
int arr[][3] = {{1, 2, 3}。{4, 5, 6}, {7, 8, 9}}。
int m = 3, n = 3;
print(n, m, arr);
return 0;
}
編輯部
從C11開始,對VLA和其他可變修改(VM)型別的支持被定為可選項。這個決定是為了鼓勵一些組織(如微軟)通過減少一些需要實作的功能,努力提高他們的編譯器(如MSVC)的合規性,希望這些可選功能能夠及時加入。AFAIK,這一舉措被認為是失敗的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322488.html
標籤:
上一篇:當列>行時,轉置矩陣給我帶來錯誤
