[英]Passing multidimensional arrays to functions?
我有一個函數setPosition聲明為:
void setPosition(char ***grid, int a, int b) {
int x = a / 8;
int xbit = a % 8;
int y = b;
(*grid)[x][y] |= 1 << xbit;
}
在我的主要工作中,我有:
char grid[1000][1000];
setPosition(&grid, 10, 5);
但是我得到“警告:從不兼容的指針類型傳遞'setPosition'的參數1”。 為什么?
數組和指針的類型不同,即使數組在傳遞給函數時確實會衰減到指針 。 您可以更改方法簽名以獲取數組
void setPosition(char grid[][1000], Pos *p)
但是,如果您使用的是C ++, vector<vector<char> >
將提供更好,更靈活的選擇。
除非它是sizeof
或一元&
運算符的操作數,或者是用於在聲明中初始化另一個數組的字符串文字,否則類型為“ T
N元素數組”的表達式將轉換為/,並替換為/“ “衰減”到類型為“指向T
指針”的表達式,其值是數組中第一個元素的地址。
如果您將函數稱為
setPosition(grid, 10, 5);
表達式grid
類型將為char [1000][1000]
,根據上述規則,該類型將替換為char (*)[1000]
類型的表達式,因此您的函數原型必須為
void setPosition(char (*grid)[1000], int a, int b) { ... }
要么
void setPosition(char grid[][1000], int a, int b) { ... }
在這種情況下是同一回事。
如果您將函數稱為
setPosition(&grid, 10, 5);
那么表達式&grid
類型為char (*)[1000][1000]
,因此您的函數原型需要為
void setPosition(char (*grid)[1000][1000], int a, int b) { ... }
並且您需要在應用任何下標之前顯式地取消引用grid
,如
(*grid)[a][b] = ...;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.