字元陣列VS字元指標

2021-04-16 17:34:04 字數 2885 閱讀 7081

1.

以字串形式出現的,編譯器都會為該字串自動新增乙個

0作為結束符,如在**中寫

"abc",

那麼編譯器幫你儲存的是

"abc/0"

2."abc"

是常量嗎?答案是有時是,有時不是。

不是常量的情況

"abc"

作為字元陣列初始值的時候就不是,如

char str = "abc";

因為定義的是乙個字元陣列,所以就相當於定義了一些空間來存放

"abc"

,而又因為字元陣列就是把字元乙個乙個地存放的,所以編譯器把這個語句解析為

char str[3] = ;

又根據上面的總結

1,所以

char str = "abc";

的最終結果是

char str[4] = ;

做一下擴充套件,如果

char str = "abc";

是在函式內部寫的話,那麼這裡的

"abc/0"

因為不是常量,所以應該被放在棧上。

是常量的情況

把"abc"

賦給乙個字元指標變數時,如

char* ptr = "abc";

因為定義的是乙個普通指標,並沒有定義空間來存放

"abc"

,所以編譯器得幫我們找地方來放

"abc"

,顯然,把這裡的

"abc"

當成常量並把它放到程式的常量區是編譯器最合適的選擇。所以儘管

ptr的型別不是

const char*

,並且ptr[0] = 'x';

也能編譯通過,但是執行

ptr[0] = 'x';

就會發生執行時異常,因為這個語句試圖去修改程式常量區中的東西。記得哪本書中曾經說過

char* ptr = "abc";

這種寫法原來在

c++標準中是不允許的,但是因為這種寫法在

c中實在是太多了,為了相容

c,不允許也得允許。雖然允許,但是建議的寫法應該是

const char* ptr = "abc";

這樣如果後面寫

ptr[0] = 'x'

的話編譯器就不會讓它編譯通過,也就避免了上面說的執行時異常。又擴充套件一下,如果

char* ptr = "abc";

寫在函式體內,那麼雖然這裡的

"abc/0"

被放在常量區中,但是

ptr本身只是乙個普通的指標變數,所以

ptr是被放在棧上的

,只不過是它所指向的東西被放在常量區罷了。

3.

陣列的型別是由該陣列所存放的東西的型別以及陣列本身的大小決定的。

如char s1[3]

和char s2[4],s1

的型別就是

char[3],s2

的型別就是

char[4],

也就是說儘管s1和

s2都是字元陣列,但兩者的型別卻是不同的。

4.

字串常量的型別可以理解為相應字元常量陣列的型別,如

"abcdef"

的型別就可以看成是

const char[7]

5.sizeof

是用來求型別的位元組數的。如

int a;

那麼無論

sizeof(int)

或者是sizeof(a)

都是等於

4,因為

sizeof(a)

其實就是

sizeof(type of a)

6.

對於函式引數列表中的以陣列型別書寫的形式引數,編譯器把其解釋為普通的指標型別,如對於

void func(char sa[100],int ia[20],char *p)則sa

的型別為

char*,ia

的型別為

int*,p

的型別為

char*,

如下面是常見的筆試題目:

char str = www.ibegroup.com

sizeof (str ) = ?(1

) void foo ( char str[100])

7.

根據上面的總結,來實戰一下:

對於char str = "abcdef";

就有sizeof(str) == 7,

因為str

的型別是

char[7]。也有

sizeof("abcdef") == 7

,因為"abcdef"

的型別是

const char[7]。對於

char *ptr = "abcdef";

就有sizeof(ptr) == 4

,因為ptr

的型別是

char*。對於

char str2[10] = "abcdef";

就有sizeof(str2) == 10

,因為str2

的型別是

char[10]。對於

void func(char sa[100],int ia[20],char *p)

,就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4

,因為sa

的型別是

char*,ia

的型別是

int*,p

的型別是

char*。

字元陣列VS字元指標

1.以字串形式出現的,編譯器都會為該字串自動新增乙個 0作為結束符,如在 中寫 abc 那麼編譯器幫你儲存的是 abc 0 2.abc 是常量嗎?答案是有時是,有時不是。不是常量的情況 abc 作為字元陣列初始值的時候就不是,如 char str abc 因為定義的是乙個字元陣列,所以就相當於定義了...

字元陣列VS字元指標

1.以字串形式出現的,編譯器都會為該字串自動新增乙個 0作為結束符,如在 中寫 abc 那麼編譯器幫你儲存的是 abc 0 2.abc 是常量嗎?答案是有時是,有時不是。不是常量的情況 abc 作為字元陣列初始值的時候就不是,如 char str abc 因為定義的是乙個字元陣列,所以就相當於定義了...

字元陣列VS字元指標

1.以字串形式出現的,編譯器都會為該字串自動新增乙個0作為結束符,如在 中寫 abc 那麼編譯器幫你儲存的是 abc 0 2.abc 是常量嗎?答案是有時是,有時不是。不是常量的情況 abc 作為字元陣列初始值的時候就不是,如char str abc 因為定義的是乙個字元陣列,所以就相當於定義了一些...