0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

字符串常量的定義與引用

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:佚名 ? 2017-09-14 11:37 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)》

第一章為程序設(shè)計基礎(chǔ),本文為1.8.2 字符串常量。

>>>>

1.8.2字符串常量

字符的真正價值在于你可以將它們串在一起形成一個字符序列,即字符串常量,簡稱字符串。字符串常量就是使用一對雙引號“""”包圍起來的,以空字符NUL(null character,NUL表示為'\0',ASCII碼值為0x00)結(jié)尾的連續(xù)的字符串,其長度為字符串的長度加1。既然使用空字符結(jié)束字符串,那么printf()和strcpy()都將這一點作為默認的前置條件。

注意,NULL和NUL是不同的,NULL表示特殊的指針,通常定義為((void *)0),而NUL是一個char,定義為\0,兩者不能混用。雖然字符常量是由單引號引起來的字符序列,通常由一個字符組成,但也可以包含多個字符,比如,轉(zhuǎn)義字符,在C中它們的類型是int:

printf("%d\n", sizeof(char));

printf("%d\n", sizeof('a'));

執(zhí)行上述代碼可以看到char的長度為1,而字符常量的長度為4。

只要在程序中使用字符串,就必須確定如何聲明保存字符串的變量。如果將它聲明為數(shù)組,則編譯時就已經(jīng)為各個字符保留了內(nèi)存空間;如果將它聲明為指針,則編譯時完全沒有為字符分配任何內(nèi)存,僅在運行時分配空間。比如:

char cStr[4] = "OK!";

char *pcStr = "OK!";

兩者的區(qū)別是,數(shù)組名cStr是常量,而指針名pcStr是變量。注意,如果在初始化指針之前就使用指針,有可能會導致運行出錯,如果有以下定義:

char *pcStr;

printf("%s", *pcStr);

由于這里沒有對pcStr初始化,因此其指向的內(nèi)存是未知的,將會打印出奇怪的字符,于是pcStr自然也就成為了野指針。

>>>1.字符串的引用

由于"OK!"是一個字符串常量,因此是不可修改的。如果試圖執(zhí)行以下操作:

pcStr[2] = 'Z';

雖然編譯期可以通過,但在運行時會出錯。如果以下面這樣的形式賦值:

char cStr[4];

cStr = "OK!";

則是非法的,因為數(shù)組變量名cStr是一個不可修改的常量指針。

如果字符數(shù)組中沒有保存'\0'',它僅僅是字符常量'O'、'K'、'!',不是字符串。即:

char cStr[] = { 'O', 'K', '!'};

而“char cStr[] = "OK!";”只不過是“char cStr[] = {'O', 'K', '!', '\0'};”的另一種寫法,因為字符串是一種特殊的字符數(shù)組變量,所以其存儲方式與數(shù)組變量一致。其中的cStr為數(shù)組變量名,表示此數(shù)組第0個元素的地址(即&cStr[0]),cStr+1表示數(shù)組第1個元素的地址(即&cStr[1]),cStr+2表示數(shù)組變量第2個元素的地址(即&cStr[2]),cStr+3表示數(shù)組變量第3個元素的地址(即&cStr[3]),其存儲形式詳見圖1.13。

圖1.13 “OK!”的存儲形式

C語言中的字符串是以字符數(shù)組變量的形式處理的,具有數(shù)組的屬性,所以不能賦值給整個字符數(shù)組變量,只能將字符逐個賦給字符數(shù)組變量。比如:

char cStr[4];

cStr[0] = 'O'; cStr[1] = 'K'; cStr[2] = '!'; cStr[3] = '\0';

其存儲的不是字符本身,而是以ASCII碼存儲的字符常量(即存值)。

慣用法

由于字符串常量以'\0'(ASCII碼值為0x00)結(jié)尾,因此可以用cStr[i]作為for循環(huán)語句的“條件部分(布爾表達式)”,檢查cStr[i]是否為'\0'(cStr[i]是以*(cStr+i)形式表示的)。用于處理字符串中每一個字符的慣用法如下:

for(i = 0; cStr[i] != '\0'; i++) …

其等價于

for(i = 0; cStr[i]; i++) …

同理“while(cStr[i] != '\0')”與“while(cStr[i])”是等價的。

當然,也可以使用scanf()函數(shù)的%s格式聲明符輸入字符串,詳見程序清單 1.37。

程序清單1.37字符串的輸入與輸出范例程序

1 #include

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

3 {

4 char cStr[10];

5

6 scanf("%s", cStr);

7 printf("%s", cStr);

8 return 0

9 }

由于cStr代表字符數(shù)組的起始地址,因此不需要在cStr前添加&運算符。但采用%s格式符輸入字符串存在一種潛在危險,如果輸入的字符串太長,超出了字符數(shù)組的存儲極限,則程序執(zhí)行錯誤,因此可以使用“字段寬度”來限制輸入字符串的長度更安全。

由于字符串常量的類型是char的數(shù)組,則在表達式中被解讀為指針。即不管字符串有多長,pcStr始終存儲字符串第一個字符的地址,因此使用指向字符串的指針變量即可整體引用一個字符串。比如:

char *pcStr = "OK!";

其中的pcStr是字符指針變量,其等效于

static const char t376[] = "OK!";

char *pcStr = t376;

其中的t376是編譯器分配的一個內(nèi)部變量名,不同編譯器、不同程序、甚至同一個源代碼每次編譯,其名字均可能不同。顯然,程序員不知道這個數(shù)組的名字,即匿名數(shù)組變量。顯而易見,初始化字符數(shù)組存儲字符串和初始化指針指向字符串的區(qū)別在于,數(shù)組名是常量,而指針名是變量,因此字符串的絕大多數(shù)操作都是通過指針完成的。

由此可見,"OK!"就是“char的數(shù)組”,通過sizeof("OK!")也可以證明字符串的本質(zhì)還是數(shù)組,即可用"OK!"作為數(shù)組變量名,詳見程序清單 1.38。

程序清單1.38用字符串作為數(shù)組變量名范例程序

1 #include

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

3 {

4 printf("OK!占用的空間%d", sizeof("OK!")); // 輸出"OK!"占用的空間,即4個字節(jié)

5 printf("OK!的地址%x\n", "OK!");// 輸出"OK!"的地址

6 printf("%c\n", *("OK!" + 1)); //輸出"OK!"的第1個元素,即'K'

7 printf("%c\n", "OK!"[0]); //輸出"OK!"的第0個元素,即'O'

8 printf("%d\n", "OK!"[3]); //輸出"OK!"第3個元素的值,即'\0'

9 return 0;

10 }

由于C語言允許對指針添加下標,因此程序清單 1.38(6~8)分別輸出對應(yīng)的元素。顯然,可以利用這種方式將0~15轉(zhuǎn)換為等價的16進制的字符,詳見程序清單 1.39。

程序清單1.39 digit_to_charhex()轉(zhuǎn)換函數(shù)范例程序

1 char digit_to_hexchar(int digit)

2 {

3 return "0123456789ABCDEF"[digit];

4 }

當pcStr指向字符串"OK!"的首地址時,*pcStr表示該地址空間上的值為'O',即pcStr[0]= 'O',pcStr[1]= 'K',pcStr[2]= '!',pcStr[3]= '\0',或*pcStr='O',*(pcStr+1)='K',*(pcStr+2)='!',*(pcStr+3)= '\0'。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    567

    瀏覽量

    20441

原文標題:周立功:字符真正價值在于形成字符序列——字符串的引用

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    周立功《程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)》:字符串函數(shù)

    本文為程序設(shè)計基礎(chǔ),本文為1.8.2 字符串常量第三點:字符串函數(shù)。
    的頭像 發(fā)表于 09-05 09:18 ?5587次閱讀

    字符串常量的接線端如何反向

    本帖最后由 209巨子 于 2016-7-23 21:35 編輯 我是新手,這幾天才開始學習LabVIEW,求助各位大神,字符串常量的接線端是如何反向的?或者說,下圖中真常量字符串
    發(fā)表于 07-23 21:34

    字符串數(shù)組常量亂碼,如何解決

    字符串數(shù)組常量輸入英文后,整個數(shù)組亂碼了如果數(shù)組全是中文是沒問題的,添加一個英文的字符后都亂碼
    發(fā)表于 04-06 15:53

    數(shù)組、向量和字符串 實驗

    實驗 5 數(shù)組、向量和字符串一、實驗?zāi)康?1. 掌握Java中的數(shù)組定義、引用2. 掌握向量的基本概念和應(yīng)用技術(shù)3. 掌握使用字符串String類
    發(fā)表于 09-23 19:00 ?1529次閱讀

    C語言入門教程-字符串須知

    字符串須知 關(guān)于字符串常量假設(shè)您編寫并運行下面兩段代碼: printf("%s ",s);} Fragment 2 {char s[100];strcpy(s,"hello");printf("%s ",s);}
    發(fā)表于 07-29 14:19 ?1143次閱讀

    LabVIEW的常用字符串操作教程免費下載

    。主要包括常用工具字符串函數(shù)、字符串常量字符串/數(shù)值轉(zhuǎn)換、字符串/數(shù)組/路徑轉(zhuǎn)換和附加字符串
    發(fā)表于 08-21 14:51 ?25次下載
    LabVIEW的常用<b class='flag-5'>字符串</b>操作教程免費下載

    2.2 python字符串類型

    2.2 python字符串類型 1. 如何定義字符串字符串是Python中最常用的數(shù)據(jù)類型之一。 使用單引號或雙引號來創(chuàng)建字符串,使用三
    的頭像 發(fā)表于 02-17 17:08 ?1376次閱讀

    字符串函數(shù)重寫練習

    字符串函數(shù)重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始化、內(nèi)存比較、二維數(shù)組
    的頭像 發(fā)表于 05-05 15:02 ?1926次閱讀

    Java反射機制清空字符串導致業(yè)務(wù)異常分析

    JVM為了提高性能和減少內(nèi)存開銷,在實例化字符串常量時進行了優(yōu)化。JVM在Java堆上開辟了一個字符串常量池空間(StringTable),JVM通過ldc指令加載
    的頭像 發(fā)表于 06-22 11:17 ?928次閱讀

    C語言總結(jié)_字符串函數(shù)封裝練習

    字符串函數(shù)重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始化、內(nèi)存比較、二維數(shù)組
    的頭像 發(fā)表于 08-14 09:42 ?932次閱讀

    格式化字符串常量f-strings一些不常見的特性

    【導語】:本文介紹了“格式化字符串常量”f-strings一些不常見的特性,包括:格式化日期和時間、同時打印變量名和變量值等,嵌套使用f-strings等,此外與其他格式化字符串的方法相比,f-strings的速度更快,因此,學
    的頭像 發(fā)表于 08-15 12:00 ?1074次閱讀

    C語言字符數(shù)組和字符串有什么區(qū)別

    用來存放字符的數(shù)組稱為字符數(shù)組。字符數(shù)組的各個元素依次存放字符串的各字符,字符數(shù)組的數(shù)組 名代表
    的頭像 發(fā)表于 02-17 14:27 ?3191次閱讀

    C語言字符串引用方式

    在C語言程序中,字符串是存放在字符數(shù)組中的。 2. 用字符數(shù)組存放一個字符串,可以通過數(shù)組名和下標引用字符串中的一個
    的頭像 發(fā)表于 03-10 14:57 ?1789次閱讀

    C語言定義字符串的幾種方法

    C語言中定義字符串有哪些方法?
    的頭像 發(fā)表于 03-31 09:41 ?3427次閱讀

    c語言字符串定義

    字符串定義、初始化、操作和常見問題。 字符串定義和初始化 在C語言中,字符串定義為一個
    的頭像 發(fā)表于 11-24 10:02 ?1660次閱讀