簡體   English   中英

C ++將對數組的引用傳遞給函數

[英]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);
}

將數組傳遞給函數的機制(指向數組的第一個元素的指針傳遞給函數)的功能類似於傳遞引用:你在helloarr所做的任何更改都將arrmain你沒有明確傳入對它的引用。 但是, 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.

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