字串主要用於編程,字串在儲存上類似字元數組,所以它每一位的單一元素都是可以提取的,如s=“abcdefghij”,則s[1]=“a”, s[9]="j",而字串的零位元正是它的長度,如s[0]=10(※上述功能Ansistring沒有。),這可以給我們很多方便,如高精度運算時每一位都可以轉換為數字存入數組。
但是字串賦值有一定要求,例如C語言的運算子根本無法操作字串。在C語言中把字串當作數組來處理,因此,對字串的限制方式和對數組的一樣,特別是,它們都不能用C語言的運算符進行複製和比較操作。
字串賦值方式
C語言中,字串的表現形式有兩種:一種是以字元陣列的形式,如char str[20] ="I love china";另一種是以字元指標的形式,如char *str="I love china"。字串可以賦值給字元指標變量,或將字串用字元數組保存。因為c語言沒有直接對字串提供語法糖方面的支援。而且C標準函式庫很多方法處理字串是以空字元結尾為前提的,這個必須要記住。
char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值??
在如上程序中,雙引號做了3件事:申請了空間(在常數區),存放了字串 ;在字串尾加上了’/0’ ;回傳地址。這裡就是把回傳的位址賦值給了p。
但是char *p = “hello”;表達式為什麼可以,而p換成數組,然後再賦值就不行了。這是因為字串常數”hello」出現在一個表達式中時,”hello”表達式使用的值就是這些字元所儲存的位址(在常數區),而不是這些字元本身。
所以,可以把字串賦值給指向字元的指標p,而不能把字串賦值給一個字元陣列。
char a[10] = “hello”; 這樣也是可以的,這種情況是c語言初始化所支援的。如果寫成char a[10]然後 a = “hello” 這樣就錯了。同樣是a數組,char a[10] = “hello”;這種是數組的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一個道理。
但是換成char a [10],然後a = “hello”就不行了“hello”賦值的值是一個地址,而a雖然也有地址,但是這與指針是不一樣的,指針的值是位址,而陣列的值雖然也是位址,但是卻是常數,所以不能給常數賦值。 [3]
我們來測試一下:
#include <stdio.h> int main(){ char *p = "hello"; printf("%s",p); char a[10]; a = "hello"; return 0;}error C2440: '=' : cannot convert from 'char [6]' to 'char [10]' There is no context in which this conversion is possible
看到這樣的錯誤提示,試試看把char a[10]改成char a[6]
error C2106: ‘=’ : left operand must be l-value
運算符的左邊應該是一個「左值」。所謂「左值」就是指在程式中佔用記憶體空間、可以被修改的量,例如各種變數。
在使用指標的時候,指標可以自增,而陣列名稱不能自增編譯器給陣列分配了空間,陣列a的位址就表示一個常數了,讓常數自增這肯定是不行的。
同時,在指標自增的時候,編譯器會自動辨識類型,例如指標是指向int型的,想取得下一個的位址時,指標直接p 就行了,不要多此一舉的p 4了。
要注意的是,在void指標使用的時候,不能使用指標運算,因為void型編譯器無法辨識類型的長度(即指標所指物件的體積),p 這樣就是不合法的,即不能進行數學運算,也不能使用*值運算,想使用必須轉換為其它的型別。
以上是字串賦值是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!