字元陣列和字元指標

2021-08-08 11:57:49 字數 3568 閱讀 3385

char sa="hello world!"

char *sp ="hello world!"

總的來說:

char sa="hello world!"

//sa是個陣列,sa也是乙個常量指標,不能改變sa的指向,」hello world」是陣列的初始化列表,可以通過下標或者間接操作來改變值

char *sp ="hello world!"

//sp指向字串常量,sp是乙個變數指標,可以改變sp的指向。不能通過下標或者間接操作來改變值。如果硬要改變的話是編譯通過但執行出錯

1、字元陣列中的元素可以改變,而指標所指字串常量的元素不可以被改變。

sa[0]='h'; //合法

sp[0]='h'; //非法

只能這樣(重新改變指向)

sp = "hello world"

2、陣列名sa是常量,其指向不可改變,而sp是變數,可以指向其他字串。

sa = "hello"; //非法

sp = "hello"; //合法

對字元陣列的賦值,要麼在初始化的時候,要麼就得用strcpy()

strcpy(sa, "wang");
3、字元指標必須賦值後引用。

因為宣告的時候,並不分配記憶體

還有乙個知識點,就是我們知道字元陣列自動在後面新增結束符『\0』,那

麼真的是

什麼時候都會進行新增嗎?。。。。

然而並不是!!!

1、 char str=」12345」; 或者 char str=;

這種方法定義時,系統會自動在字串的末尾加上字串結束符,即 『\0』

2、char str[10]=;這種方法定義時,系統會自動從未初始化的元素開始,將之後的元素賦為\0,如上面的陣列str中的元素實際上是:』1』,』2』,』3』,』4』,』5』,』\0』,』\0』,』\0』,』\0』,』\0』

但是!!!!

!!引用char str=;這種方法定義時,系統不會自動在字串的末尾加上字串結束符;

說明分立的並且未指定大小的字元陣列是不會進行添0的!

通過一段**進行理解。

#include 

#include

#include

int main()

; char *str3="12345";

char str4=;

char str5=;

printf("%d,%d,%d,%d,%d,%d\n",str2[5],str2[6],str2[7],str2[8],str2[9],str3[4]);

printf("各個字串為:%s,%s,%s,%s,%s\n",str1,str2,str3,str4,str5);

printf("各個字串的所佔的記憶體大小為:%d,%d,%d,%d,%d\n",sizeof(str1),sizeof(str2),sizeof(str3),sizeof(str4),sizeof(str5));

printf("各個字串的有效長度為:%d,%d,%d,%d,%d\n",strlen(str1),strlen(str2),strlen(str3),strlen(str4),strlen(str5));

printf("%d\n",strcmp(str1,str3));

printf("%d\n",strcmp(str1,str5));

}

sizeof和strlen的知識補習:

0,0,0,0,0,53

//注意這裡的53是對應的ascii

各個字串為:12345,12345,12345,12345,1234512345

各個字串的所佔的記憶體大小為:6,10,4,6,5

各個字串的有效長度為:5,5,5,5,100-1

process returned 0 (0x0) execution time : 0.246 s

press any key to continue.

參考部落格,有所得:

1、lvalue required as increment operand (lvalue – 左值)

關於左值和右值得問題,不再專門開篇大論了!

概括來說:

左值 - -是可以進行儲存資料的地方。

右值 - -是可以表示結果值。

這個是我自己以前寫的乙個程式

#include 

#include

int main()

while(*p++ != '\0')//用乙個指標指向就可以了!

printf("%d", len);

return

0;}

當我使用注釋那一段程式的時候,編譯就有了lvalue required as increment operand的error,百思不得其解。查資料方才了解到:陣列名是常量指標,並不能像左值那樣進行++操作!

(這也就引出了另乙個知識點,指標常量和常量指標)

同時也了解到:陣列名不是常量指標的情況只有兩種,就是當陣列名是sizeof和&的運算元時,前者產生整個陣列的占用的位元組數,後者產生乙個指向陣列的指標

2、下標引用和間接操作是一樣的

1

#include

2int main(int argc,char **argv)

3 ;5int

*b=array+1;

6printf("%d\n",b[1]);

7printf("%d\n",*(b+1));

8printf("%d\n",b[-1]);

9printf("%d\n",b[10]);

10printf("%d\n",1[b]);

11return

0;12 }

輸出

331

32595

3

這個例子說明了幾個很有意思的事實,b是指標,但是b還是可以使用下標操作符,c在處理下標操作符時把b[1]看成*(b+1)

這也是為什麼1[b]是合法的原因,1[b]被看成了*(1+b),在編譯器看來b[1]和1[b]並沒有區別。

並且c語言不進行下標檢查,這是基於相信coder的設計思想,並且檢查下標要消耗一定的資源

字元陣列和字元指標

字元陣列是一段記憶體空間 字元指標是乙個位址,指向一串字元。char str abcd char str abcd 字元陣列是一段記憶體空間 字元指標是乙個位址,指向一串字元 char str abcd char str abcd 上面這兩跳複製語句很相似,其實根本就不是一碼事。對於兩個 abcd ...

字元指標和字元陣列

1.字元指標可以指向乙個字串。我們可以用字串常量對字元指標進行初始化。例如,有說明語句 char str this is a string.是對字元指標進行初始化。此時,字元指標指向的是乙個字串常量的首位址,即指向字串的首位址。這裡要注意字元指標與字元陣列之間的區別。例如,有說明語句 char st...

字元陣列和字元指標

1.在函式getmem棧內定義個陣列,將位址return給main函式的指標str eg char p hello world char getmemory void char p hello world return p void test void char str null str getme...