簡體   English   中英

無法從'int *'轉換為'int []'?

[英]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 * ,即指向數組第一個元素的指針。 沒有其他信息,特別是沒有保留大小。 返回指針時也一樣

請注意,數組不是指針:指針可以更改為指向其他內容,而數組總是指向同一個內存; 指針不知道它指向的內存空間有多大,而數組的大小在編譯時總是知道的。 混淆源於這樣一個事實:在許多情況下,數組衰減到指向其第一個元素的指針,並將其傳遞給函數/從函數返回它是這些情況中的一些。

那么,為什么你的代碼不起作用? 有兩個大錯誤:

  1. 您正在嘗試使用指針初始化數組。 我們說int *沒有任何關於數組大小的信息。 它只是指向第一個元素的指針。 所以編譯器無法知道有多大a提出,要適應返回的東西f()

  2. f您將返回指向該函數本地變量的指針。 這是錯誤的,因為指針實際上並不存儲數據,它只指向數據存儲的位置,即在你的情況下指向f a本地。 因為該數組是函數的本地數組,所以當函數退出時(即return )它就不再存在。

    這意味着您返回的指針指向不再存在的內容; 考慮代碼:

     int * a = f(); 

    這種初始化工作,你可以嘗試使用a在后面的功能,而是a將指向的不再視為存在陣列f ; 在最好的情況下,你的程序會崩潰(你會立即注意到你做錯了什么),最壞的情況似乎會工作一段時間,然后開始給出奇怪的結果。

int *和int []相似但不同。 int *是一個實數指針,同時int []是一個數組引用(一種指向數據開頭的“常量指針”),它不能被修改。 因此,int *可以像int []一樣進行威脅,但不能反之。

您可以互換地使用a[b]*(a+b)因為當ab中的一個是指針而另一個是整數或枚舉類型時,這正是a[b]的定義方式。

注意:這也意味着42[a]類的表達式是完全合法的。 人類讀者可能強烈反對,但編譯器不會盯着這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM