[C/C++] char s[]和char *s的差別

1. C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢?

char str[] = "Hello World";
char *s = "Hello World";

char str[] = “Hello World";

是一個char array,是array,所以sizeof的大小會是12byte
有12個byte(包含結尾\0),
“Hello World"對s來說是initializer,
將字元一個一個地copy進s陣列。

char str[] = "hello";
str = "world";  // error, incompatible types in assignment

如果使用陣列的方式宣告字串,則不可以直接使用 = 指定運算子另外指定字串

char *s = “Hello World";

是一個pointer指向char,是pointer,所以sizeof(*s)的大小會是1byte
由於"Hello World"本身就是一個string literal,
所以s指向"Hello World"這個string literal的起始記憶體位置。

這樣的宣告方式只宣告了指標,但是並沒有實體位置

char *s = new char [strlen("hello") + 1];

只有char *s可以直接使用*s++寫法。
char s[]為陣列,雖然s = &s[0],但s是常數
但char *s是pointer,指向s[0],但卻是變數,可以任意改變,故可用*s++任意更改pointer值。

2. 指標陣列

在字元指標中使用指標陣列,可以更方便地處理字串陣列,例如:

#include <stdio.h>

int main(void) {
    char *str[] = {"professor", "teacher", "student", "etc."};

    for(int i = 0; i < 4; i++) {
        puts(str[i]);
    }

    return 0;
}

下面兩個宣告的作用雖然類似,但其實意義不同:

char *str1[] = {"professor", "Justin", "etc."};
char str2[3][10] = {"professor", "Justin", "etc."};

char *str1[]
是使用指標陣列,每一個指標元素指向一個字串常數,只要另外指定字串常數給某個指標,該指標指向的記憶體位址就不同了。

char str2[3][10]
配置連續的 3×10 的字元陣列空間,串是直接儲存在這個空間,每個字串的位址是固定的,而使用的空間也是固定的(也就是含空字元會是10個字元)。

Reference:
[1]. (原創) char s[]字串和char *s字串有什麼差別? (C/C++) (C)
http://www.cnblogs.com/oomusou/archive/2007/03/04/663234.html

[2]. 字串反轉-範例練習(錯誤發掘&修正)
http://dannysun-unknown.blogspot.tw/2015/03/blog-post_10.html

[3]. 指標與字串
https://openhome.cc/Gossip/CGossip/PointerAndString.html

發表留言