[問題] cannot convert int (*)[size] to int*

作者: tarantula (不要改我暱稱)   2022-05-17 15:33:27
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Dev C++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
[Error] cannot convert 'int (*)[size]' to 'int*' in assignment
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
[Error] cannot convert 'int (*)[size]' to 'int*' in assignment
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
int main()
{
int i,a[5] = {32,16,9,7,0};
cout<<"a = "<<a<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"&a[0] = "<<&a[0]<<endl;
int sum = 0;
sum = 0;
int *ptr;
ptr = &a; // why this is not acceptable
// ptr = &a[0];
// ptr = a;
for(i = 0;i<5;i++)
{
sum += *ptr;
ptr += 1;
}
return 0;
}
補充說明(Supplement):
ptr = &a; // why this is not acceptable
// ptr = &a[0];
// ptr = a;
只有第一行給出錯誤訊息,後兩行都可以,但我不明白為什麼,
從上面print out 的結果看起來
a == &a == &a[0]
如果是單個變數 int *ptr= &a; 給過
不明白為什麼陣列a不能。
謝謝解說 感恩
作者: mikemike1021 (mike)   2022-05-17 15:41:00
&a 是 int** 吧?
作者: Friend5566 (你的友情56)   2022-05-17 16:19:00
如果開的變數是陣列a[5] a跟&a[0]是pointer &a則是double pointer
作者: g0010726 (Kevin)   2022-05-17 16:22:00
因為&a是指向一個陣列的pointer,跟int*一個指向int的pointer 型態不相容,沒法自動轉換。純粹兩個位址相同不代表可以直接assign其實錯誤訊息很清楚了 就是型態無法轉換另外樓上講的不太正確 &a 的型態是 int (*)[5]指的是 a pointer (*) to an array [] of size 5containing integers 並不是什麼pointer to pointer (**)
作者: tarantula (不要改我暱稱)   2022-05-17 16:39:00
謝謝大家解惑。跪
作者: Lipraxde (Lipraxde)   2022-05-17 16:54:00
推薦個網站:cdecl.org
作者: simon860730 (╰電磁學╮╭爆炸囉╯)   2022-05-21 14:43:00
紅明顯 借問一下 什麼是double pointer ?_?
作者: OnlyRD (里巷人)   2022-05-21 16:32:00
怎麼會是&a?a = int [5] , &a 當然變成 pointer to array of int , 隱式轉型成int** . 去把 right-left rule 看一遍,就全部搞懂了。如果要更進一步計較int** or int[5]* ,會在template裡面考慮,有可能需要decay出場,否則在指標操作上,考慮隱式轉換就好了。
作者: Friend5566 (你的友情56)   2022-05-21 17:32:00

Links booklink

Contact Us: admin [ a t ] ucptt.com