char c和char c 的區別

2021-07-07 10:01:19 字數 1485 閱讀 6031

其實總結起來就是一句話,char *就是乙個指標,char c是乙個陣列,但是c可以有些指標的用法。

1.char *

char * c中,c是乙個字元指標,它可以擁有棧記憶體,也可以擁有靜態記憶體。具體看它指向的是什麼了。比如

char a = 'a';

char *c = &a;

這時c就擁有棧記憶體,它指向棧中的乙個字元變數。

char *c = "abcdefg";

這時c擁有靜態記憶體,因為它指向字串常量「abcdefg」中的第乙個字元'a'

2.char c

這裡c宣告了乙個陣列,肯定是放在棧記憶體區域的。

c在這裡只是擁有類似於乙個字元指標的行為(比如*c可以訪問陣列最開始那個元素),它並不是乙個char *,此時c的型別是char。

由以上1和2兩點就能很明白地弄清這兩者在使用中上面的區別與注意事項了。

①當char *指向常量字元,無法更改指向的內容。

這個時候,不可更改char *指向的內容。

比如char * x = "abc";

*x = 'x';

是會出錯的。

相比而言,如果是指向乙個棧記憶體,則怎麼改都無所謂。

②char *完全可以更改指向誰。

char * x = "abc";

char  y[20] = "hello";

x = y;

既然char *是乙個指標,你向讓它指向誰就指向誰啊。如果你繼續讓它指向乙個常量,就不能更改指向的物件。

但是如果你已經改變它指向乙個棧記憶體中的物件,就可以通過它更改指向的物件了。

③char c不能將c完全當做指標。

如果c僅僅是乙個指向陣列第乙個元素的指標,那麼我可以讓c重新指向乙個字元。

char c[20] = "hello";

char x = 'x';

c = &x;

不過這是不行的,歸根結底還是因為c就是乙個char 型別。不能將char *賦值給char ,就算是另乙個一樣長度的char 也不能這樣賦值。

注意事項,

以上提到的都是它們本身是什麼型別,和最終輸出什麼沒有一定的關係。

乙個字元指標,你可以將其當做字串輸出。

而cout就會將其當做字串輸出。

比如char a[20] = "hello";

char x = 'x';

char *c = &x;

cout  << c << endl;

我在codeblocks,用g++4.8.1編譯器,

這樣執行的結果,是xhello,也就是說,儘管c是字元指標,但是它指向的物件和a代表的物件在棧記憶體中挨著了,如果處理為字串,它們就是乙個字串。

所以在c++和c風格的**混合使用的時候要特別小心。

char c 與 char c 的區別

char c hello world 是分配乙個區域性陣列。char c hello world 是分配乙個全域性陣列。區域性陣列是區域性變數,它對應的是記憶體中的棧。全域性陣列是全域性變數,它對應的是記憶體中的全域性區域。字串常量儲存在唯讀的資料段,而不是像全域性變數那樣儲存在普通資料段 靜態儲存...

資料轉換位元組擴充套件 char c 128

char c 128 printf d c 將c語言 彙編,可以看到128轉換成了 128 c語言char型別的表示範圍 128 127。128 補碼10000000b 裝載到暫存器exa中 屬於有符號數擴充套件,按照符號位填充高位位元組。由於 128最高為是1,為負數,擴充套件為int的 128為...

c語言 int轉char c語言的函式指標

簡單定義並間接呼叫 define crt secure no warnings include includevoid singasong void main 輸出結果 define crt secure no warnings include includeint gloabalnum 888 i...