老犯此類錯誤!!!
char *p = "abc";則abc儲存在常量儲存區,而p直接指向了這個常量儲存區,所以不能改變abc的內容
*p = 'd'; 是錯誤的,因為是常量儲存區,不能改變。
char *p = null;
*p = 'd';
也是錯誤的。
char *p;
*p='d';
也是錯誤的,提示指標沒有賦初值。
以上幾種更不可以strcpy(p,"abc");
總之,上面的指標都相當於const char *p,不能修改*p的內容!但可以修改其指向,如:
char *a = "abc";
p = a;
是可以的。但這樣的操作不安全!!因為如果一旦a被**了,p就跟著完蛋了。尤其是如果在子函式中,區域性變數自動**,這種不安全行為就會突出。
字元陣列:
char p="abc";//相當於strcpy(p,「abc」),如果定義在全域性,abc就在全域性區,如果在區域性,abc就在棧內。
*p = 'd'; 是正確的,
不過這樣的p已經固定了其長度(為3+1=4),p相當於陣列p[4],且p[3]=='\0'
printf("%d\n",p[3]);
p[3] = 'b';
printf("%d\n",p[3]);
都是可以的。
但p[4] = 'd'越界
總之,字元陣列相當於有限長度的char *const p;
可以修改內容,但不可以修改指向
如果想要乙個可以改變值且不固定長度的字串,安全的辦法就是使用動態分配malloc和realloc
char *a = "abc";
char *p = (char *)malloc(sizeof(char)*strlen(a));
strcpy(p,a);
是正確的。
另外對於字串或者陣列,要時刻注意在後面新增結束符'\0',否則極易出問題,比如
int i;
char a[5];
for(i=0; i<4; i++)a[i]=i+'0';
printf("%s",a);
沒有結束符,列印出來是亂碼。
安全簡單的做法是宣告陣列時讓其元素初始化為
int i;
char a[5] = ;
for(i=0; i<4; i++)a[i]=i+'0';
printf("%s",a);
當然不能把最後乙個結束符都擠掉了,比如下面的也會出問題
int i;
char a[5] = ;
for(i=0; i<5; i++)a[i]=i+'0';
printf("%s",a);
因為最後的結束符a[4] 被沖掉了。
C C 的一些關於字元陣列和指標的小總結
1.陣列作為引數,引數定義時可以寫成 int b或是 int b,傳值時寫成 b 或者 b 0 是等價的。因為對於一維陣列來說,b就是指數組b的首位址。也就是說傳入函式時,b就退化成單獨的位址了,並且不儲存任何有關陣列的長度。所以,你休想在函式定義中獲得其長度,真是痛苦,只有在傳參時多加入幾個引數來...
關於字元陣列和字元指標
include void main 對於字元陣列a,其中的內容是可以改變的。可以再次對某個元素賦值 如 a 2 r 正確 a中存放首字元的位址,但不可被改變。a adeafsa 錯誤 對於字元指標變數p,它指向了乙個字串常量,而常量被儲存在常量區,是不可改變的 如 p r 錯誤 不過可以對指標變數p...
關於指標字串和陣列字串的一些經驗
經驗 1.如果用ap和bp的話,是無法引用的,因為它不是指向乙個常量的。2.如果用ap1和bp1的話,可以引用,但是交換的其實是 位址,因為常量區是無法被修改的。3.而如果把函式改為 字元的引用,就是交換的是內容。想想這是為什麼?上面的為什麼指向的是常量區?二 為了解決這個疑問,我們來看看實質的差別...