2010-04-18 86 views
7

我很好奇,爲什麼這是一個錯誤,錯誤信息的含義。下面是一些代碼:這段代碼中的指針發生了什麼?

int *x[] = {"foo", "bar", "baz"}; 
int *y[] = {"foo", "bar", "baz"}; 

x = y; 

我嘗試編譯,我得到這個:

error: incompatible types when assigning to type ‘char *[3]’ from type ‘char **’ 

問題1爲什麼這是一個錯誤?和問題#2爲什麼類型不同?

+10

爲什麼要在保存整型指針的數組中存儲字符串? – 2010-04-18 03:13:17

+0

你檢查了行號嗎? – SLaks 2010-04-18 03:14:35

回答

5

正如所寫,存在不少問題。首先,數組文字的類型爲char*[],而xy的類型爲int*[]。其次,你不能直接分配數組,因爲它們實際上是常量指針。

+2

我真的希望這個模因會死。數組不是常量指針 - 它們不是任何類型的指針,它們是數組(相同類型的非空連續對象序列)。 – caf 2010-04-18 09:02:27

+1

一個變量,其類型是C中的一個數組,遵循與常量指針非常相似的語義。這與重力的處理方式是一樣的 - 當然,這在全球範圍內並不是一成不變的,它並不是一個真正的向下的力量。儘管如此,考慮到絕大多數用途的這些方面都是有用的。 – 2010-04-18 09:11:40

3

有一個不兼容的類型錯誤,因爲要分配串的陣列(類型char *在C)的指針的陣列以整數(如int *x[])。編譯器給出的錯誤信息有點令人困惑,因爲C在後臺做了很多嘗試將變量從一種類型轉換爲另一種類型。由於字符在內部表示爲數字(字母對應於它們的ASCII值),所以C能夠將字符轉換爲整數,因此它試圖將變量x和y作爲指向chars而不是ints的指針數組來處理,因此char *[3]。它看到{「foo」的「條」,「巴茲」}爲char **類型,因爲字符串是char *類型並且基本上存儲爲C指針數組,所以它是一個指向char *,或者char **

雖然這與您的問題並不完全相關,但我也想知道您要怎麼處理x = y;如上所述,這會使x指向與y相同的數組,使x使用的數組指向無法訪問。要檢查C中的兩個變量是否相等,可以使用==運算符。對數組或字符串測試相等性並不那麼簡單,但這完全超出了這個問題的範圍。

0

我建議從指針和數組的好教程開始。看起來你可能來自像JavaScript或PHP這樣的解釋型語言。事情在C完全不同的,你需要得到棧內存,堆內存,指針等的概念,一個手柄一旦你這樣做,這將是行得通的,你會愛C.

2

這是一個錯誤,因爲數組是一個不可修改的左值 - 意味着你不能直接指定它。您只能單獨修改陣列的成員。

類型不同,因爲如果在不需要左值的上下文中使用數組,它將被評估爲指向其第一個元素的指針(somearray實際上變爲&somearray[0])。

由於在這種情況下使用了數組y,因此它被評估爲其第一個元素的地址,該元素的類型爲int **。由於陣列x處於左值上下文,它被評價爲一個陣列(int *[3])。 (你的錯誤信息實際上並不符合你的代碼 - 我懷疑你的數組實際上是char *的數組)。 (「左值上下文」的意思是相當多,其中一個:賦值運算符的左側(這是名稱的來源);運算符的主題;或運算符的主題) 。

0

由於某種原因,我不能使用我發佈該問題的相同帳戶。

「int」是我的一個錯字,我真的認爲它是「char」。對困惑感到抱歉。

但是,我認爲caf回答了我的問題。

「這是一個錯誤,因爲數組是一個不可修改的左值 - 意味着你不能直接指定它,你只能單獨修改數組的成員。」

我只是想了解指針如何在C中工作,這就是爲什麼我試着這些隨機的東西,你可能通常不會這樣做。我認爲這可能工作,因爲我認爲數組=指針,所以我可以讓x指向y。我猜不會?

感謝您的回覆傢伙。