2012-06-06 22 views
2

可能重複:
Is array name a pointer in C?是一個數組的右值嗎?

#include <stdlib.h> 
int main(int argc, const char *argv[]) 
{ 
    char *b=(char*)malloc(sizeof(char)*50); 
    b=(char*)"hello world"; 
    // works 

    char a[50]; 
    a=(char*)"hello world"; 
    //doesn't work. why? I thought array names are just pointers that point 
    //to the first element of the array (which is char). so isn't a char*? 
    return 0; 
} 

我認爲它不工作的原因是因爲沒有所謂的變量 「a」,實際上存儲一個char *值。所以'a'應該被認爲是一個右值?我不知道如果我理解正確的概念

+3

一個命名對象總是一個左值。 –

+4

數組不是指針,但你似乎試圖使用它。 – chris

+3

有這些東西(甚至更多)一個非常詳盡的解釋[這裏](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c)。 –

回答

7

數組不是指針,有時[注1:]一個陣列的名稱衰減到一個指針數組時名無效(例如:使起作用)。
數組是不可修改1-值,它們不能被分配有地址可以採取。

[注1:]
例如:在sizeof()

陣列地址使用時,不能改變,但內容可以改變
陣列名稱不衰減到的指針。

+2

@Luchian:C89的「編譯時」,而不是C99的VLA。它總是一個操作員,而不是一個功能。 –

+0

@SteveJessop:轟。對於VLA的標準命令'sizeof'來做運行時評估。 –

+0

@AlokSave _Arrays是不可修改的l值,它們不能被賦值_ - 通常是true,但是這個規則也有一個例外:'char const str [] =「this will be copied」;'字符串文字是一個左值'被複制到'str'的​​char數組。 – legends2k

4

我以爲數組名是公正的指針

不,他們不是。他們是數組。當你將它們作爲參數傳遞時,衰減成爲指針,但就是這樣。您無法重新分配數組,只能更改單個值。

5

陣列是不可修改的左值。你不能分配任何東西,但你可以應用一元運算符&

當你說這裏有沒有涉及char *變量你是對的。數組名稱直接引用數組對象 - 一個連續的內存塊,其大小等於元素數和元素大小的乘積。

相關問題