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...