[英]Cannot convert from 'int *' to 'int []'?
我知道這可能是一個常見的問題,但我試圖搜索但仍然找不到明確的答案。
我有以下代碼:
int* f() {
int a[] = {1,2,3};
return a;
}
int main() {
int a[] = f(); // Error here
getch();
return 0;
}
此代碼生成錯誤消息:“ Cannot convert from 'int *' to 'int []'
”
我發現這很奇怪,因為我已經讀過指針和數組是相似的。 例如,我們可以使用[i]代替*(a + i)。 請問有人能給我一個明確的解釋嗎?
這段代碼實際上有兩個錯誤。
首先,您返回臨時的地址( f
的int數組),因此在函數返回后其內容未定義。 任何嘗試訪問返回指針指向的內存都將導致未定義的行為。
其次,在C ++中沒有從指針到數組類型的隱式轉換。 它們相似但不完全相同。 數組可以衰減到指針,但它不會反過來因為信息在路上丟失 - 指針只代表一個內存地址,而數組代表連續區域的地址,通常具有特定的大小。 您也無法分配給數組。
例如,我們可以用[i]代替*(a + i)
然而,這與數組和指針之間的差異幾乎沒有關系,它只是指針類型的語法規則。 當數組衰減為指針時,它也適用於數組。
int[]
類型實際上並不存在。
定義和初始化數組時
int a[] = {1,2,3};
編譯器對初始化程序中的元素進行計數,並創建一個正確大小的數組; 在這種情況下,它神奇地變成:
int a[3] = {1,2,3};
int[]
用作函數的參數,相反,它只是普通的int *
,即指向數組第一個元素的指針。 沒有其他信息,特別是沒有保留大小。 返回指針時也一樣
請注意,數組不是指針:指針可以更改為指向其他內容,而數組總是指向同一個內存; 指針不知道它指向的內存空間有多大,而數組的大小在編譯時總是知道的。 混淆源於這樣一個事實:在許多情況下,數組衰減到指向其第一個元素的指針,並將其傳遞給函數/從函數返回它是這些情況中的一些。
那么,為什么你的代碼不起作用? 有兩個大錯誤:
您正在嘗試使用指針初始化數組。 我們說int *
沒有任何關於數組大小的信息。 它只是指向第一個元素的指針。 所以編譯器無法知道有多大a
提出,要適應返回的東西f()
在f
您將返回指向該函數本地變量的指針。 這是錯誤的,因為指針實際上並不存儲數據,它只指向數據存儲的位置,即在你的情況下指向f
a
本地。 因為該數組是函數的本地數組,所以當函數退出時(即return
)它就不再存在。
這意味着您返回的指針指向不再存在的內容; 考慮代碼:
int * a = f();
這種初始化工作,你可以嘗試使用a
在后面的功能,而是a
將指向的不再視為存在陣列f
; 在最好的情況下,你的程序會崩潰(你會立即注意到你做錯了什么),最壞的情況似乎會工作一段時間,然后開始給出奇怪的結果。
int *和int []相似但不同。 int *是一個實數指針,同時int []是一個數組引用(一種指向數據開頭的“常量指針”),它不能被修改。 因此,int *可以像int []一樣進行威脅,但不能反之。
您可以互換地使用a[b]
和*(a+b)
因為當a
或b
中的一個是指針而另一個是整數或枚舉類型時,這正是a[b]
的定義方式。
注意:這也意味着42[a]
類的表達式是完全合法的。 人類讀者可能強烈反對,但編譯器不會盯着這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.