2013年8月20日 星期二

String literals in C

先看一下以下的例子,你知道哪個可以改內容,哪個不能改嗎?

char *name = "Jack";

char name[] = "Jack";

在 C 裡很常會用到字串,使用的時候要注意,宣告時的不同,會造成使用上的不同。像上面的例子,char *name 是不能修改的;char name[] 才能夠修改。要區分它們,要了解它們在記憶體上的什麼位置。

當 char *name = "Jack" 被宣告之後,它會把 "Jack" 這個字串放進 constants 記憶體區域,這是唯讀的!而 name 只是指向 "Jack" 的指標,所以你不可以對它做修改的動作。

而 char name[] = "Jack" 被宣告之後,它一樣會把 "Jack" 這個字串放進 constants 記憶體區域,但是它會複製一份內容到 stack 裡,所以你修改的不是在 constants 記憶體區域的值,而是在 stack 裡的值。

另外,當你看到 char name[] 這個宣告時,也要注意一點,"你是在哪裡看到它的?"

如果是一般變數宣告,例:

int test()
{
    char name[] = "Jack";
    ....
}

那麼它就是陣列,要給它一個初值。

如果是宣告成函式引數,例:

void test( char name[])
{
    ....
}

就表示它是一個指標(pointer),它和下面的式子是一樣的。

void test( char *name)
{
    ....
}

沒有留言:

張貼留言