先看一下以下的例子,你知道哪個可以改內容,哪個不能改嗎?
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)
{
....
}
沒有留言:
張貼留言