我是 C 新手,我對將指標陣列傳遞給函式的想法感到困惑。
這是功能
void func(int *a){ a[0]=999;}
這是主要使用的
int main()
{
int a[5]={1,2,3,4,5};
func(a);
std::cout << a[0]<< std::endl;
}
我理解這非常有效,因為陣列的名稱只是其第一個元素的地址。根據我的理解,&a指的是整個陣列的地址,而a指的是陣列的第一個元素的地址,應該和&a. 但是,如果我使用
int main(){
int a[5]={1,2,3,4,5};
func(&a);
cout<< a[0]<< endl;
}
它回傳編譯器錯誤:no known conversion from 'int (*)[10]' to 'int *' for 1st argument; remove &
誰能解釋一下這里發生了什么?
uj5u.com熱心網友回復:
情況1
我理解這非常有效,因為陣列的名稱只是其第一個元素的地址。
上述說法在技術上并不正確。第一個示例之所以有效,是因為在許多情況下(包括將陣列作為引數按值傳遞給函式時),由于型別衰減,陣列會衰減到指向其第一個元素的指標。這意味著,在示例 1 中,當您作為引數傳遞時,存在一個隱式陣列到指標的轉換,它將您的型別陣列轉換為指向其第一個元素的指標,即 type 。因此在示例 1 中,引數的型別和引數的型別匹配,示例 1 成功。aaint[5]int*
還要注意,即使衰減的指標和陣列的地址都具有相同的值,但它們的型別是不同的。衰減的指標是 type int*,而&a是 type int (*)[5]。
案例2
誰能解釋一下這里發生了什么?
這是因為ais of typeint [5]意味著&a它的型別int (*)[5]與引數的型別不匹配int*。
也就是說,當您修改代碼時,您傳遞&a的是型別int (*)[5],但函式引數是型別int*,因此引數的型別和您傳遞的引數不匹配,并且沒有隱式轉換一個int (*)[5]到一個int*我們得到提到的錯誤說:
no known conversion from 'int (*)[5]' to 'int *'
uj5u.com熱心網友回復:
我理解這非常有效,因為陣列的名稱只是其第一個元素的地址。
這是一種微妙的錯誤理解。該陣列int[10]可以隱式轉換為指向第一個元素(地址)的指標int*。當您呼叫接受int*引數和傳遞int[10]引數的函式時,就會發生這種隱式轉換。
&a指的是整個陣列的地址,而a指的是陣列的第一個元素的地址,應該與&a
指標的值是相同的。但是指標的型別是不同的。一個是指向陣列的指標int (*)[10],另一個是指向此類陣列元素的指標int*。兩種型別都不會隱式轉換為另一種型別,因此您不能將&a其作為引數傳遞給期望的函式int*。語言的型別系統可以防止你犯錯誤。這由編譯器診斷訊息解釋。
uj5u.com熱心網友回復:
視為a指標。它指向陣列的第一個元素,a[0](或*a)。
然后&a是指標的地址,與上面無關。
注意(&a)[0]or*(&a)回傳指標,while (&a)[0][0]or (*(&a))[0]or *((&a)[0])or**(&a)回傳陣列的第一個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483996.html
