字串賦值給乙個指標後,再次賦值的時候發現會報錯。而將指標當作指標陣列賦值時,卻可以修改。
char* a=(char*)malloc(sizeof(char)*5);
char* b=(char*)malloc(sizeof(char)*5);
a="abc\0";
b[0]='a'; b[1]='b'; b[2]='c'; b[3]='\0';
a[0]='e';
b[0]='e';
檢視指標所指向的位址是否發生改變
char* a=(char*)malloc(sizeof(char)*5); char* b=(char*)malloc(sizeof(char)*5);
char* d=(char*)malloc(sizeof(char)*5); char* e=(char*)malloc(sizeof(char)*5);
//列印位址
printf("a:%d\n",&*a); printf("b:%d\n",&*b); printf("d:%d\n",&*d); printf("e:%d\n",&*e);
printf("\n\n");
a="abc\0"; e="abc\0";
b[0]='a'; b[1]='b'; b[2]='c'; b[3]='\0';
char c[5]="abc\0";
d="abcd\0";
//賦值之後列印位址,檢視是否發生變化
總結:
(1)發現將乙個字串常量賦值給指標後,指標所指向的位址改變了。a和e是兩個指標變數,但是在使用相同的字串常量賦值後,所指向的記憶體位址是乙個。
(2)陣列c可以修改,且位址空間離其它變數特別遠。
說明:陣列c開闢的空間在堆疊裡。
(3)
a="abc\0";d="abcd\0";
a和d所指向的字串僅僅差了乙個字母,但位址緊鄰卻不同。
說明:這是兩個字串常量,同時也說明說明:程式在初始化的時候僅會將該程式將使用的字串常量放到乙個區域(僅讀不可修改)。
(4)b的位址沒有改變。
在使用 malloc()為指標開闢空間時,開闢的空間都是指向堆疊裡的空間。但如果用常量給其賦值,指標就會指向不可修改的常量區,但之前開闢的空間仍然存在。
C語言常量字串
關於c語言字串常量不可修改,起初誤認為是編譯器 把這樣的 char s str 優化成了 const char str const屬性也去不了。但是實際上是與常量字串的記憶體體現有關。bodata段 bss段 bss段 bsssegment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域...
c語言不能把字元常量賦值給字元陣列
char s 20 s helo 這樣是錯誤的,原因就是不能用賦值語句將乙個字串常量直接給乙個字元陣列賦值。char s 20 char ss hello s ss 這也是錯誤的,原因是不能用賦值語句將乙個字元陣列直接給乙個字元陣列賦值 即字串的複製 c語言中,但是在c 的string 類,上面的賦...
為什麼字串可以賦值給字元指標變數
2.指標可以自增,而陣列不能自增 指標是位址變數,而陣列是位址常量 3.void指標不能進行指標運算,也不能進行 取值操作 所指向的物件型別不確定 5.字元常量的型別可以理解為字元常量陣列的型別。例如 abcd 的型別可以看成 const char 5 6.陣列的型別是由該陣列所存放的元素的型別和陣...