在 C++ 中返回指向陣列的指標
本文將講解 C++ 中函式中返回陣列指標的幾種方法。
在 C++ 中使用 int var[n]
記法將陣列引數傳遞給函式,然後返回
由於函式需要返回指標值,我們將假設陣列是固定長度的。另外,如果我們必須將一個動態陣列-std::vector
傳遞給函式,最好使用引用。
下一個例子演示了 subtructArray
函式,該函式減去了 array
中給定的 subtrahend 值。陣列被宣告為一個原始的 C-風格陣列,這對於使用指標的操作非常有用。陣列在傳遞的時候,引數的符號是 int arr[]
,但它在下面被編譯器轉換為陣列的指標,我們可以在函式體中這樣處理。最後,它直接使用變數名返回指標值,而不使用&
運算子取其地址。
減去的陣列元素會輸出到控制檯,輸出最後一個元素後,有 cout
語句,在字串字面中包含\b\b
。這個轉義序列意味著模擬了退格鍵行為,從而刪除了控制檯輸出的最後兩個字元。
#include <iostream>
#include <array>
using std::cout; using std::cin;
using std::endl; using std::string;
using std::array;
int *subtructArray(int arr[], int size, int subtrahend)
{
for (int i = 0; i < size; ++i) {
arr[i] -= subtrahend;
}
return arr;
}
constexpr int SIZE = 10;
int main(){
int c_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 15;
int *ptr = subtructArray(c_array, SIZE, num);
cout << "array1 = [ ";
for (int i = 0; i < SIZE; ++i) {
cout << ptr[i] << ", ";
}
cout << "\b\b ]" << endl;
return EXIT_SUCCESS;
}
輸出:
array1 = [ -14, -13, -12, -11, -10, -9, -8, -7, -6, -5 ]
在 C++ 中使用 int* var
符號將陣列引數傳遞給函式,然後返回
另一種傳遞固定大小的陣列的方法是用 int* var
符號宣告一個函式引數,並在函式體完成處理後返回指標值。注意,接下來的示例程式碼使用 std::array
容器,並呼叫 data()
方法來檢索儲存陣列元素的指標。return
語句和上一個方法一樣使用變數名。
#include <iostream>
#include <array>
using std::cout; using std::cin;
using std::endl; using std::string;
using std::array;
int *subtructArray(int *arr, int size, int subtrahend)
{
for (int i = 0; i < size; ++i) {
arr[i] -= subtrahend;
}
return arr;
}
constexpr int SIZE = 10;
int main(){
array<int, SIZE> arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 15;
int *ptr2 = subtructArray(arr1.data(), arr1.size(), num);
cout << "array2 = [ ";
for (int i = 0; i < SIZE; ++i) {
cout << ptr2[i] << ", ";
}
cout << "\b\b ]" << endl;
return EXIT_SUCCESS;
}
輸出:
array1 = [ -14, -13, -12, -11, -10, -9, -8, -7, -6, -5 ]
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn