[英]C++ Pass a reference to an array to function
給函數void main()和void hello(byte * a [4])。 主函數有一個四個字節的數組。 需要將數組的引用傳遞給函數hello以進行操作。 我希望正確的語法是:
void hello(byte* a[4]){
// Manipulate array
a[0] = a[0]+1;
}
void main(){
byte stuff[4] = {0,0,0,0};
hello(&stuff);
// hopefully stuff is now equal {1,0,0,0}
}
或者,我看到其他人使用這種形式的decaration:
void hello(byte (&a)[4])
這是正確的方法嗎?
這里有很多不同的選擇,取決於你想在這里做什么。
如果你有一個原始的byte
對象數組,你可以將它傳遞給這樣的函數:
void hello(byte arr[]) {
// Do something with arr
}
int main() {
byte arr[4];
hello(arr);
}
將數組傳遞給函數的機制(指向數組的第一個元素的指針傳遞給函數)的功能類似於傳遞引用:你在hello
對arr
所做的任何更改都將arr
在main
你沒有明確傳入對它的引用。 但是, hello
函數不會檢查數組是否大小為4 - 它將輸入任意數量字節的數組作為輸入。
你也可以寫
void hello(byte (&arr)[4]) {
// ...
}
int main() {
byte arr[4];
hello(arr);
}
語法byte (&arr)[4]
表示“對四個字節數組的引用”。 這通過引用顯式地將數組傳遞給hello
,它將檢查數組的大小以確保它是正確的。 但是,這是非常不尋常的語法,在實踐中很少見到。
但也許最好的想法是不使用原始數組並使用std::array
代替:
void hello(std::array<byte, 4>& arr) {
// Do something with arr
}
int main() {
std::array<byte, 4> arr;
hello(arr);
}
現在,在字節數組的語法中沒有關於奇怪括號的奇怪之處,並且不用擔心大小檢查。 一切都處理得當,因為std::array
是一種具有常規對象類型的所有優點的對象類型。 我建議采用最后一種方法優先於其他所有方法。
數組已經通過指針傳遞。
所以這:
int a(int array[]) {
}
這樣做是一樣的:
int a(int * array) {
}
這樣做:
void hello(byte (&a)[4])
只允許傳入長度為4的數組。
byte* a[4]
是一個由四個指向byte
指針組成的數組,但參數列表除外。
在參數列表中,它是指向byte
的指針 - 即它等效於byte**
。
byte (*a)[4]
是指向四元素數組的指針。
byte (&a)[4]
是對四元素數組的引用。
在你的情況下, &stuff
是一個指向四元素數組的指針,所以你的參數應該是byte (*a)[4]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.