char c 與 char c 的區別

2021-09-25 14:29:27 字數 985 閱讀 9416

char c = "hello world!";
是分配乙個區域性陣列。

char *c = "hello world!";
是分配乙個全域性陣列。

區域性陣列是區域性變數,它對應的是記憶體中的棧。全域性陣列是全域性變數,它對應的是記憶體中的全域性區域。字串常量儲存在唯讀的資料段,而不是像全域性變數那樣儲存在普通資料段(靜態儲存區),如:

char *c = "hello world!";

*c = 't'; // 錯誤

c 占用乙個儲存區域,但是區域性區的資料是可以修改的:

char c = "hello world!";

c[0] = 't'; // 正確

這裡 c 不佔儲存空間。

但是如果遇到先宣告後賦值的情況:

char* sp, s[10]; 

sp = "hello"; //正確

s = "hello"; //錯誤

因為,陣列名代表被分配的記憶體的首位址,是乙個位址常量,是右值;而指標作為變數,卻是乙個左值。

增例(2019.08.13):

const char str1 = "abc";

const char str2 = "abc";

const char *p1 = "abc";

const char *p2 = "abc";

printf("%d %d %d %d\n", str1, str2, p1, p2);

結果:前面兩個輸出的數不同,後面兩個相同

前兩個是字元陣列(如果不是全域性),定義在棧上,明顯位址不同

字串常量定義在靜態區,僅有乙份拷貝,所以後面兩個指標指向的位址相同

char c和char c 的區別

其實總結起來就是一句話,char 就是乙個指標,char c是乙個陣列,但是c可以有些指標的用法。1.char char c中,c是乙個字元指標,它可以擁有棧記憶體,也可以擁有靜態記憶體。具體看它指向的是什麼了。比如 char a a char c a 這時c就擁有棧記憶體,它指向棧中的乙個字元變數...

資料轉換位元組擴充套件 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...