C言語字符數組和字符指針

常量和符號常量

在程序運轉進程中,其值不克不及被改動的量稱之爲常量。常量分爲分歧的類型,有整型常量如 1、2、3、100;浮點型常量 3.14、0.56、-4.8;字符型常量a、b、0;字符串常量“a”、“abc”、“1234”、“1234abcd”等。
仔細的同窗會發現,整型和浮點型常量我們直接寫的數字,而字符型常量用單引號來表現一個字符,用雙引號來表現一個字符串,特別人人要留意a和“a”是紛歧樣的,這個等會我們要具體引見。
常量普通有兩種表示方式:

  • 直接常量:直接以值的方式表現的常量稱之爲直接常量。上述舉例這些多是直接常量,直接寫出來了。

  • 符號常量:用標識符定名的常量稱之爲符號常量,就是爲下面的直接常量再取一個名字。運用符號常量一是便利瞭解,進步程序可讀性,更主要的是便利程序的後續保護,習氣上符號常量我們都用大寫字母和下劃線來定名。


比方,我們可以把 3.14 取名爲 PI(即π)。再比方,我們上節課的串口程序,我們用的波特率是 9600,假如用符號常量來停止提早聲明的話,那我們要修正成其它速度的話,就不必在程序中找 9600 修正了,直接修正聲明處就可以了,兩種辦法舉例闡明。用 const 聲明。比方我們在程序開端地位界說一個符號常量 BAUD。
界說方式是:
    const  類型  符號常量名字=常量值;

    const unsigned int BAUD = 9600;  /*留意開頭有個分號*/
我們就可以在程序中直接把 9600 改成 BAUD,如許我們假如要改波特率的話,直接在程序掃尾地位改一下這個值就可以了。用預處置敕令#define 來完成,預處置敕令我們先來看法#define。
界說方式是:
    #define  符號常量名  常量值

    #define  BAUD  9600  /*留意開頭沒有分號*/
如許界說今後,只需在程序中呈現 BAUD 的話,意思就是完整替代了後邊的 9600 這個數字。
不知人人能否記得,我們之前界說數碼管真值表的時分,用了一個 code 癥結字。

			unsigned char code LedChar[] = { //數碼管顯示字符轉換表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };

我們事先說加了 code 之後,這個真值表的數據只能被運用,不克不及被改動,假如我們直接寫 LedChar[0] = 1;如許就錯了。實踐上 code 這個癥結字是 51 單片機特有的,假如是其它類型的單片機我們只需求寫成 const unsigned char LedChar[]={}就可以了,主動保管到 FLASH裏,而 51 單片機只用 const 而不加 code 的話,這個數組會保管到 RAM 中,而不會保管到FLAHS 中,鑑於此,在 51 這集體系下,const 反倒變得不那麼主要了,它的感化被 code 代替了,這裏人人曉得這麼回事即可。
我們來對各類類型的常量做進一步闡明。
整型常量和浮點型常量就沒若干可說的了,之前我們使用的都很純熟了,整型直接寫數字就是十進制如 128,前邊 0x 掃尾的表現是十六進制 0x80,浮點型直接寫帶小數點的數據就可以了。
字符型常量是由一對單引號括起來的單個字符。它分爲兩種方式,一種是通俗字符,一種是本義字符。
通俗字符就是那些我們可以直接書寫直接看到的無形的字符,比方阿拉伯數字 0~9,英文字符 A~z,以及標點符號等。它們多是 ASCII 碼錶中的字符,而它們在單片機中都佔用一個字節的空間,其值就是對應的 ASCII 碼值。比方a的值是 97,A的值是 65,0的值是48,假如界說一個變量 unsigned char a = a,那麼變量 a 的值就是 97。
除了上述這些字符以外,還有一些特別字符,它們一些是有形的,像回車符、換行符這些多是看不到的,還有一些像\”這類字符它們曾經有特別用處了,想象一下假如寫 '''認爲編譯器會怎樣去說明呢。針對這些特別符號,爲了可以讓它們正常進入到我們的程序代碼中,C 言語就規則了本義字符,它是以反斜槓(\)掃尾的特定字符序列,讓它們來表現這些特別字符,比方我們用\n 來代表換行。我們用一個複雜表格來闡明一下常用的本義字符的意思,如表 12-2 所示。
表 12-2 常用本義字符及寄義

字符方式寄義
\n換行
\t橫向跳格(相當於 Tab)
\v豎向跳格
\b退格
\r光標移到行首
\\反斜槓字符\
\單引號字符
\”雙引號字符
\f走紙換頁
\0空值


表格不需求人人記住,用到了,過去查就可以了。
字符串常量是用雙引號括起來的字符序列,普通我們都稱之字符串。如“a”、“1234”、“welcome to www.kingst.org”等多是字符串常量。字符串常量在內存中按次序逐一存儲字符串中的字符的 ASCII 碼值,而且特殊留意,最初還有一個字符\0,\0字符的 ASCII 碼值是 0,它是字符串完畢標記,在寫字符串的時分,這個\0是隱蔽的,我們看不到,然則實踐倒是存在的。所以“a”就比a多了一個 \0,“a”的就佔了 2 個字節,而 a只佔一個字節。
還有一 個地 方要注 意, 就是字 符串 中的空 格, 也是一 個字 符,比 如 “welcome to www.kingst.org”一共佔了 26 個字節的空間。箇中 21 個字母,2 個.,2 個 (空格字符)以及一個\0。

字符和字符串數組實例

爲了比照字符串、字符數組、常量數組的差別,我們寫個了複雜的演示程序,界說了 4個數組辨別是:

			unsigned char array1[] = "1-Hello!\r\n"; unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'}; unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10}; unsigned char array4[] = "4-Hello!\r\n";


在串口調試助手下,發送十六進制的 1、2、3、4,運用字符方式顯示的話,會辨別往電腦上送這 4 個數組中對應的誰人數組。我們只是在肇端地位做了辨別,其它均沒有差別。人人可以比擬一下後果。
此外還要闡明一點,數組 1 和數組 4,數組 1 我們是發完好的字符串,而數組 4 我們僅僅發送數組中的字符,沒有發完畢符號。串口調試助手用字符方式顯示是沒有差別的,然則人人假如改用十六進制顯示,人人會發現數組 1 比數組 4 多了一個字節 \0 的 ASCII 值 00。


			#include <reg52.h> bit cmdArrived = 0; //敕令抵達標記,即接納到上位機下發的敕令 unsigned char cmdIndex = 0; //敕令索引,即與上位機商定好的數組編號 unsigned char cntTxd = 0; //串口發送計數器 unsigned char *ptrTxd; //串口發送指針 unsigned char array1[] = "1-Hello!\r\n"; unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'}; unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10}; unsigned char array4[] = "4-Hello!\r\n"; void ConfigUART(unsigned int baud); void main(){ EA = 1; //開總中綴 ConfigUART(9600); //設置裝備擺設波特率爲 9600 while (1){ if (cmdArrived){ cmdArrived = 0; switch (cmdIndex){ case 1: ptrTxd = array1; //數組 1 的首地址賦值給發送指針 cntTxd = sizeof(array1); //數組 1 的長度賦值給發送計數器 TI = 1; //手動方法啓動發送中綴,處置數據發送 break; case 2: ptrTxd = array2; cntTxd = sizeof(array2); TI = 1; break; case 3: ptrTxd = array3; cntTxd = sizeof(array3); TI = 1; break; case 4: ptrTxd = array4; cntTxd = sizeof(array4) - 1; //字符串實踐長度爲數組長度減 1 TI = 1; break; default: break; } } } } /* 串口設置裝備擺設函數,baud-通訊波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //設置裝備擺設串口爲形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //設置裝備擺設 T1 爲形式 2 TH1 = 256 - (11059200/12/32)/baud; //盤算 T1 重載值 TL1 = TH1; //初值等於重載值 ET1 = 0; //制止 T1 中綴 ES = 1; //使能串口中綴 TR1 = 1; //啓動 T1 } /* UART 中綴效勞函數 */ void InterruptUART() interrupt 4{ if (RI){ //接納到字節 RI = 0; //清零接納中綴標記位 cmdIndex = SBUF; //接納到的數據保管到敕令索引中 cmdArrived = 1; //設置敕令抵達標記 } if (TI){ //字節發送終了 TI = 0; //清零發送中綴標記位 if (cntTxd > 0){ //有待發送數據時,持續發送後續字節 SBUF = *ptrTxd; //收回指針指向的數據 cntTxd--; //發送計數器遞加 ptrTxd++; //發送指針遞增 } } }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章