關於字元指標和字元陣列的一些錯誤

2021-06-09 04:09:26 字數 1447 閱讀 5343

老犯此類錯誤!!!

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.而如果把函式改為 字元的引用,就是交換的是內容。想想這是為什麼?上面的為什麼指向的是常量區?二 為了解決這個疑問,我們來看看實質的差別...