字元'/0'
和'0'
的區別字元
』0』對應的ascii碼為十六進製制30;而』/0
』即為ascii碼中的0,其對應字元空字元nul。
char c = '/0';çè
char c = 0// nul
char c = '0';çè
char c = 48;
最典型如memset函式:void *memset( void *buffer, int ch, size_t count );
將一段長為count位元組的記憶體塊初始化為ascii碼值0,字元為nul:
memset
(pbuffer, '/0', sizeof(pbuffer) );çè
memset
(pbuffer, 0, sizeof(pbuffer) );
字串
字串常量是雙引號括起的任意字串行。 例如
:"hello world","fantasy","please enter your full name:",…… c
語言沒有專門定義字串資料型別(如其他語言中的
string
),所謂的字串,只是對字元陣列的一種特殊應用而已,它用以
'/0'
結尾的字元陣列來表示乙個邏輯意義上的字串。
在字串常量中,顯然不能直接寫雙引號,因為這將被認為是字串的結束。轉義序列在字串常量中要包含雙引號,需要用「/"
」表示。如:"hello /"accp/""
與字元陣列不同的是:在存完字串常量的所有字元之後,還要另存乙個空字元'/0'作為結束的標誌,空字元是ascii碼值為0的字元,c語言中用'/0'標識字串的結束,所以也稱為結束符。如果在程式裡寫了字串:
char
hello="hello"或;
雖然只有5個字元,在記憶體中卻需要占用6個位元組儲存,其中'/0'表示空字元。儲存情況如: h
e ll o
/05005
5006
5007
5008
5009
500a
而字元陣列
char
hello=;
的長度和大小則為5.
根據字串儲存形式的規定,只要在陣列裡順序存入所需字元,隨後存乙個空字元,這個字元陣列裡的資料就有了字串的表現形式,這個陣列也就可以當作字串使用了。分析
char
str="abc";
因為定義的是乙個字元陣列,所以就相當於定義了一些空間來存放"abc",而又因為字元陣列就是把字元乙個乙個地存放的,所以編譯器把這個語句解析為
char
str[3] = ;
根據上面的總結,所以
char
str="abc";
的最終結果是
char
str[4] = ;
即char
str = <==>
char str="abc"
值得注意的是只有在程式中對字串進行處理時,才考慮字串結束標誌的問題。考慮字元陣列
char
a[4]=;a
陣列中存放的是字串「boy」。如果執行語句a[1]='/0';後,a陣列的內容為'b'
,'/0','y','/0'
。此時系統認為a陣列中存放了乙個字串「b」,printf("a=%s/n",a);輸出的結果是a=b; printf("length a=%d/n",strlen(a))輸出的結果是length a=1, 而printf("sizeof a=%d/n",sizeof(a));輸出結果為4.不要認為陣列中只有'b'和'/0'了,只不過按系統對字串的處理方式來看就是這樣的。
char
s3[10]="hello";//s3
是編譯期大小已經固定的陣列
inta=strlen(s3); //a=5;//strlen()
在執行起確定
intb=sizeof(s3); //b=10;//sizeof()
在編譯期確定
sizeof(s)
strlen(s)
char
*s="hello"; 4
5char
s="hello"; 6
5char
s[10]="hello"; 10
5 注意printf("hello is %s/n",hello);和cout《以及標頭檔案中的庫函式只能操作以'/0'
結尾的字串,故對char
hello=;操作無效。
以下為四種hello字串的定義:
char
hello1="hello";
char
hello2=;//
等同於hello1
char
hello3=;//
等價於hello1
char
*hello4="hello";//
區別:hello1是字元陣列,hello4是字元指標。
用strlen函式測試hello1,hello2,hello3,hello4的結果均為5,因為不計末尾結束符』/0
』。常用
hello1或hello4來定義字串。
字串與指標c
語言中許多字串的操作都由指向字元陣列的指標及指標的運算來實現的。因為對字串來說一般都是嚴格順序訪問,使用指標可以打破這種訪問方式,使字串的處理更加靈活。
以下**利用指標簡潔的實現了字串拷貝函式:
void strcpy(s,t)//copy t to s
char *s,*t;
解析:*s++=*t++,先賦值*s=*t,然後指標後移t++,s++,當遇到*t='/0'
時,則拷貝操作完成。
char *
pchar
;char *
text
= "hello"
;pchar
= new
char[
strlen
(text
) + 1];
// 注意這裡考慮終止字元!
cout
<<
strcpy
(pchar
, text
) <<
endl
; //
不能用pchar = text;
cout
<< (
strcmp
(pchar
, text
) == 0) <<
endl
; //
不能用pchar == text;
字串常量
當乙個字串常量出現於表示式中時,它的值是個指標常量。編譯器把這些指定字元的乙份拷貝儲存在記憶體的某個位置,並儲存乙個指向第乙個字元的指標。
"xyz"+1;//
這個表示式計算
「指標值加上
」的值,返回乙個指標,指向字串中的第二個字元'y'
*"xyz";//
返回第乙個字元'x'
"xyz"[2];//
返回第三個字元'z'
*("xyz"+4);//
偏移量超過了這個字串的範圍,返回乙個不可**的字元
那什麼使用會用到上述表示式呢?我們考慮把二進位制轉換為字元並把它們列印出來。
remainder = value % 16;//value
對求餘儲存到remainder中
if(remainder < 10)//0~9
putchar(remainder + '0');
else
10~15
putchar(remainder - 10 + 'a');
下面的**用一種不同的方法解決這個問題:
putchar("0123456789abcdef"[value % 16]);
參考:
《指標
》
《陣列與指標
》
字元指標與字串
例項1 include using namespace std int main 執行結果 error 例項2 include using namespace std int main 執行結果 helloworld例項3 include using namespace std int main 執...
字串與指標
printf的第二個引數的型別是由 第乙個引數format決定的。當format為 s時,第二個引數就是乙個位址,printf將位址上的值輸出到stdout。當format為 d時,第二個引數就是乙個int型的變數,printf將變數上值輸出到stdout。1 字串的表示形式 在c語言中,我們可以用...
字串與指標
在c語言中,有兩種方式儲存字串,一種是字元陣列,另一種就是指標形式。第一種,字元陣列 字元陣列儲存字串,可以借助陣列下標值訪問和修改字串中的任意乙個字元。第二種 指標形式儲存字串 一 雙引號的作用 1.申請了空間 在常量區 存放了字串 2.在字串尾加上了 0 3.返回位址,返回的位址給p。以字串形式...