字串賦值是什麼意思

藏色散人
發布: 2019-06-04 10:19:17
原創
9951 人瀏覽過

字串主要用於編程,字串在儲存上類似字元數組,所以它每一位的單一元素都是可以提取的,如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: &#39;=&#39; : cannot convert from &#39;char [6]&#39; to &#39;char [10]&#39;        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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板