我已經啟動了一個包含 6 個元素的陣列,并嘗試使用一個名為“print”的函式來列印它。我使用了 stl 庫中的陣列物件。我將陣列物件的地址傳遞給列印函式。當我嘗試在列印函式中更改陣列物件的值時,出現型別不匹配錯誤。
#include <bits/stdc .h>
using namespace std;
void print(array<int, 6> *arr){
for(int i : *arr){
cout<<i<<" ";
}
*(*arr 2)=2;
cout<<endl;
}
int main(){
array<int, 6> arr2={1, 2, 3, 4, 5, 6};
print(&arr2);
print(&arr2);
}
uj5u.com熱心網友回復:
在*(*arr 2)=2;您尊重array指標并嘗試添加2到它,然后取消參考該結果到 assign 2。我假設你要分配2索引的元素2中array。
但是,您不需要在這里使用指標,請使用array按參考。
而且,從不#include <bits/stdc .h>。
#include <array> // include the proper header files
#include <iostream>
void print(std::array<int, 6>& arr) { // by reference
for (int i : arr) {
std::cout << i << ' ';
}
arr[2] = 2; // assign 2 to the element at index 2
std::cout << '\n'; // std::endl flushes the stream which is usually uncessary
}
int main() {
std::array<int, 6> arr2 = {1, 2, 3, 4, 5, 6};
print(arr2); // and don't take the array address here
print(arr2);
}
如果你真的想在這里使用指標,這可能是一個選項:
#include <array>
#include <iostream>
void print(std::array<int, 6>* arr_ptr) { // pointer
if (arr_ptr == nullptr) return; // check that it's pointing at something
std::array<int, 6>& arr = *arr_ptr; // dereference it
for (int i : arr) {
std::cout << i << ' ';
}
arr[2] = 2;
std::cout << '\n';
}
int main() {
std::array<int, 6> arr2 = {1, 2, 3, 4, 5, 6};
print(&arr2);
print(&arr2);
}
uj5u.com熱心網友回復:
這個說法
*(*arr 2)=2;
沒有意義。例如,沒有為類模板 std::array 定義運算子 ,因此該運算式*arr 2無效。
你可以寫
( *arr )[2] = 2;
或者例如
*( ( *arr ).begin() 2 ) = 2;
uj5u.com熱心網友回復:
*(*arr 2)=2;
相當于
(*arr)[2] = 2;
if arr是指向陣列的指標。我想這就是你要找的。但是從這個意義上說,std::array實體不是陣列。它是一個封裝陣列的物件,并模擬底層陣列的一些屬性,但它不能與底層陣列互換使用。特別是,std::array物件不會像實際陣列那樣衰減為指標,并且您的代碼似乎正試圖依賴它。
你可以改為
*((*arr).data() 2) = 2;
或者,更慣用地說,
*(arr->data() 2) = 2;
利用該陣列到指標的衰減。或者你可以做
arr->data()[2] = 2;
. 但這些都不像...
(*arr)[2] = 2;
...已經提到,如果您必須使用指向 a 的指標而不是對 a 的參考,那么您應該這樣做std::array。
uj5u.com熱心網友回復:
首先注意std::array沒有operator . 因此,當您撰寫運算式時:
*arr 2 // INCORRECT
在上面的運算式中,您取消參考指向的指標std::array,然后添加2到結果中。但正如我一開始所說,沒有operator for std::array,這個運算式是不正確的。
局限性
其次,你的程式有一個限制是,該功能print可以接受的指標std::array與唯一的 6元素。因此,如果您嘗試將指標傳遞給std::array不同大小的指標,那么您的程式將無法運行。
解決方案
您可以通過以下方式解決這些問題:
std::array通過參考傳遞。- 使用模板。特別是,使用模板非型別引數。
使用模板非型別引數的優點是現在您可以呼叫print具有std::array不同大小的函式,如下所示。
#include <iostream>
#include <array>
template<std::size_t N>
void print(std::array<int, N> &arr){ //by reference
for(const int &i : arr){
std::cout<<i<<" ";
}
arr.at(2) = 2; //use at() member function so that you don't get undefined behavior
std::cout<<std::endl;
}
int main(){
std::array<int, 6> arr2={1, 2, 3, 4, 5, 6};
print(arr2);
std::array<int, 10> arr3 = {1,2,4,3,5,6,7,8,9,10};
print(arr3);
}
我所做的一些修改包括:
- 洗掉
#include <bits/stdc .h>并僅包含所需的標題。 - 使用的模板。特別是,通過使用模板非型別引數消除了限制。
- 通過
std::array參考。也就是說,不需要將指標傳遞給std::array. 我們可以std::array通過參考傳遞。 - 使用
at()成員函式,這樣我們就不會越界,也不會得到未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406181.html
標籤:
上一篇:關于c中的自由函式
