在int main()我宣告的內部double* arr = new double[2];(一個陣列,它的專案應該設定為雙精度或無)
然后我嘗試通過將陣列元素的值void func(double* arr_pointer[2])設定為
arr_pointer[1] = nullptr;
arr_pointer[0] = nullptr;
但是在我通過列印檢查它們的值是否更改為nullptr(在主函式中)之后
cout << (nullptr == &arr[0]) << ' ' << (nullptr == &arr[1])
我進入1 0控制臺,為什么?
最小的可重現示例:
#include <iostream>
void func(double* arr_pointer[2], double& abc) {
if (abc > 0) {
(*arr_pointer)[0] = 20;
(*arr_pointer)[1] = 22;
}
else if (abc == 0) {
(*arr_pointer)[0] = 10;
arr_pointer[1] = nullptr;
}
else {
arr_pointer[1] = nullptr;
arr_pointer[0] = nullptr;
}
}
int main() {
double* arr = new double[2];
double abc = -1.2;
func(&arr, abc)
std::cout << (nullptr == &arr[0]) << ' ' << (nullptr == &arr[1])
}
uj5u.com熱心網友回復:
double* arr = new double[2];(一個陣列,其專案應設定為雙精度或無)
arr是指向 a 的指標double。它指向 2 個雙精度陣列的第一個元素。元素是雙重物件;它們不能是“無”的物件。此外,該陣列不包含任何指標。
旁注:避免擁有裸指標。更喜歡使用std::vector.
void func(double* arr_pointer[2])
陣列型別的函式引數被調整為指向該陣列元素的指標。這個函式的引數是double**指向double的指標。
您將無法呼叫func(arr),因為 adouble*不能隱式轉換為double**.
cout << (nullptr == &arr[0]) << ' ' << (nullptr == &arr[1])
您正在將陣列元素的地址與 null 進行比較。arr除非您在初始化后進行了修改,否則兩個元素的地址都不應等于 null 。
關于您的編輯:
func(&arr, abc)
arr是一個單數指標物件。它不是多指標陣列中的元素。
arr_pointer[1] = nullptr;
arr_pointer[1]指向arr物件的末尾,并分配給它會導致未定義的行為。如果程式的輸出是您不期望的,那可能是因為程式的行為未定義。如果該程式是您所期望的,則可能盡管行為未定義。不要這樣做。
arr_pointer[0] = nullptr;
由于arr_pointer指向arr,間接通過arr_pointer和分配將導致arr被分配。換句話說,這將設定arr為指向 null。由于arr是指向動態陣列的唯一指標,這意味著不能再解除分配;這是記憶體泄漏。
在此分配之后,是否&arr[0]允許存在疑問,因為該下標運算子將通過空指標進行間接尋址。但是,如果我們假設它是允許的,那么arr == nullptr暗示&arr[0] == nullptr.
uj5u.com熱心網友回復:
請注意,引數double* arr_pointer[2]不是兩個指標的陣列,它是指向指標的指標double;它相當于double** arr_pointer。
(您不能將陣列傳遞給函式;該[]符號只是向人類讀者提示,該引數應該是一個陣列。)
您的代碼具有未定義的行為,因此它可以輸出任何內容。
也許這最好通過行內函式來解釋:
int main() {
double* arr = new double[2];
double abc = -1.2;
double** arr_pointer = &arr;
// Now, *arr_pointer, a.k.a. arr_pointer[0], is the same as arr
// and *(arr_pointer 1), a.k.a arr_pointer[1], does not exist.
// It is undefined to dereference arr_pointer 1.
if (abc > 0) {
(*arr_pointer)[0] = 20; // arr[0] = 20
(*arr_pointer)[1] = 22; // arr[1] = 20
}
else if (abc == 0) {
(*arr_pointer)[0] = 10; // arr[0] = 10
arr_pointer[1] = nullptr; // arr_pointer[1] does not exist - undefined
}
else {
arr_pointer[1] = nullptr; // arr_pointer[1] does not exist - undefined
arr_pointer[0] = nullptr; // arr = nullptr
}
std::cout << (nullptr == &arr[0]) << ' ' << (nullptr == &arr[1])
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446153.html
下一篇:C,指標陣列中的值消失(指標)
