精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

字符串常量的定義與引用

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

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

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

>>>>

1.8.2字符串常量

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

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

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

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

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

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

char cStr[4] = "OK!";

char *pcStr = "OK!";

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

char *pcStr;

printf("%s", *pcStr);

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

>>>1.字符串的引用

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

pcStr[2] = 'Z';

雖然編譯期可以通過(guò),但在運(yùn)行時(shí)會(huì)出錯(cuò)。如果以下面這樣的形式賦值:

char cStr[4];

cStr = "OK!";

則是非法的,因?yàn)閿?shù)組變量名cStr是一個(gè)不可修改的常量指針。

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

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

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

圖1.13 “OK!”的存儲(chǔ)形式

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

char cStr[4];

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

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

慣用法

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

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

其等價(jià)于

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

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

當(dāng)然,也可以使用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前添加&運(yùn)算符。但采用%s格式符輸入字符串存在一種潛在危險(xiǎn),如果輸入的字符串太長(zhǎng),超出了字符數(shù)組的存儲(chǔ)極限,則程序執(zhí)行錯(cuò)誤,因此可以使用“字段寬度”來(lái)限制輸入字符串的長(zhǎng)度更安全。

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

char *pcStr = "OK!";

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

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

char *pcStr = t376;

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

由此可見,"OK!"就是“char的數(shù)組”,通過(guò)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個(gè)字節(jié)

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

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

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

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

9 return 0;

10 }

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

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

1 char digit_to_hexchar(int digit)

2 {

3 return "0123456789ABCDEF"[digit];

4 }

當(dāng)pcStr指向字符串"OK!"的首地址時(shí),*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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    577

    瀏覽量

    20485

原文標(biāo)題:周立功:字符真正價(jià)值在于形成字符序列——字符串的引用

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

    數(shù)組、向量和字符串 實(shí)驗(yàn)

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

    C語(yǔ)言入門教程-字符串須知

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

    LabVIEW的常用字符串操作教程免費(fèi)下載

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

    2.2 python字符串類型

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

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

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

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

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

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

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

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

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

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

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

    C語(yǔ)言字符串引用方式

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

    C語(yǔ)言定義字符串的幾種方法

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

    c語(yǔ)言字符串定義

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