女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]指向數(shù)組元素的指針和運算法則所謂指向數(shù)組元素的指針,其本質(zhì)還是變量的指針。因為數(shù)組中的每個元素,其實都可以直接看成是一個變量,所以指向數(shù)組元素的指針,也就是變量的指針。指向數(shù)組元素的指針不難,但很常用

指向數(shù)組元素的指針和運算法則


所謂指向數(shù)組元素的指針,其本質(zhì)還是變量的指針。因為數(shù)組中的每個元素,其實都可以直接看成是一個變量,所以指向數(shù)組元素的指針,也就是變量的指針。


指向數(shù)組元素的指針不難,但很常用。我們用程序來解釋會比較直觀一些。

unsigned char number[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

unsigned char *p;

如果我們寫 p = &number[0];那么指針 p 就指向了 number 的第 0 號元素,也就是把number[0]的地址賦值給了 p,同理,如果寫 p = &number[1];p 就指向了數(shù)組 number 的第 1號元素。p = &number[x];其中 x 的取值范圍是 0~9,就表示 p 指向了數(shù)組 number 的第 x 號元素。指針本身,也可以進行幾種簡單的運算,這幾種運算對于數(shù)組元素的指針來說應(yīng)用最多。

比較運算。比較的前提是兩個指針指向同種類型的對象,比如兩個指針變量 p 和 q它們指向了具有同種數(shù)據(jù)類型的數(shù)組,那它們可以進行 <,>,>=,<=,==等關(guān)系運算。如果 p==q 為真的話,表示這兩個指針指向的是同一個元素。

指針和整數(shù)可以直接進行加減運算。比如還是上邊我們那個指針 p 和數(shù)組 number,如果 p = &number[0],那么 p+1 就指向了 number[1],p+9 就指向了 number[9]。當(dāng)然了,如果 p = &number[9],p-9 也就指向了 number[0]。

兩個指針變量在一定條件下可以進行減法運算。如 p = &number[0]; q = &number[9];那么 q-p 的結(jié)果就是 9。但是這個地方大家要特別注意,這個 9 代表的是元素的個數(shù),而不是真正的地址差值。如果我們的 number 的變量類型是 unsigned int 型,占 2 個字節(jié),q-p 的結(jié)果依然是 9,因為它代表的是數(shù)組元素的個數(shù)。


在數(shù)組元素指針這里還有一種情況,就是數(shù)組名字其實就代表了數(shù)組元素的首地址,也就是說:

p = &number[0];

p = number;

這兩種表達方式是等價的,因此以下幾種表達形式和內(nèi)容需要大家格外注意一下。


根據(jù)指針的運算規(guī)則,p+x 代表的是 number[x]的地址,那么 number+x 代表的也是number[x]的地址?;蛘哒f,它們指向的都是 number 數(shù)組的第 x 號元素。


*(p+x)和*(number+x)都表示 number[x]。


指向數(shù)組元素的指針也可以表示成數(shù)組的形式,也就是說,允許指針變量帶下標,即 p[i]和*(p+i)是等價的。但是為了避免混淆與規(guī)范起見,這里我們建議大家不要寫成前者,而一律采用后者的寫法。但如果看到別人那么寫,也知道是怎么回事即可。


二維數(shù)組元素的指針和一維數(shù)組類似,需要介紹的內(nèi)容不多。假如現(xiàn)在一個指針變量 p和一個二維數(shù)組 number[3][4],它的地址的表達方式也就是 p=&number[0][0],有一個地方要注意,既然數(shù)組名代表了數(shù)組元素的首地址,那么也就是說 p 和 number 都是指數(shù)組的首地址。對二維數(shù)組來說,number[0],number[1],number[2]都可以看成是一維數(shù)組的數(shù)組名字,所以 number[0]等價于 &number[0][0], number[1]等價于 &number[1][0], number[2]等價于&number[2][0]。加減運算和一維數(shù)組是類似的,不再詳述。

指向數(shù)組元素指針的實例


在 C 語言里邊,sizeof()可以用來獲取括號內(nèi)的對象所占用的內(nèi)存字節(jié)數(shù),雖然它寫作函數(shù)的形式,但它并不是一個函數(shù),而是 C 語言的一個關(guān)鍵字,sizeof()整體在程序代碼中就相當(dāng)于一個常量,也就是說這個獲取操作是在程序編譯的時候進行的,而不是在程序運行的時候進行。這是一個實際編程中很有用的關(guān)鍵字,靈活運用它可以為程序帶來更好的可讀性、易維護性和可移植性,在后續(xù)的例程學(xué)習(xí)中將會慢慢有所體會的。


sizeof()括號中可以是變量名,也可以是變量類型名,其結(jié)果是等效的。而其更大的用處是與數(shù)組名搭配使用,這樣可以獲取整個數(shù)組占用的字節(jié)數(shù),就不用自己動手計算了,可以避免錯誤,而如果日后改變了數(shù)組的維數(shù)時,也不需要再到執(zhí)行代碼中逐個修改,便于程序的維護和移植。


下面我們提供了一個簡單的串口演示例程,可以體驗一下指針和 sizeof()的用法。例程首先接收上位機下發(fā)的命令,根據(jù)命令值分別把不同數(shù)組的數(shù)據(jù)回發(fā)給上位機,程序還用到了指針的自增運算,也就是+1 運算,大家可以認真考慮一下指針 ptrTxd 在串口發(fā)送的過程中的指向是如何變化的。在上位機串口調(diào)試助手中分別下發(fā) 1、2、3、4,就會得到不同的數(shù)組回發(fā),注意這里都用十六進制發(fā)送和十六進制顯示。


此外,這個程序還應(yīng)用到一個小技巧,大家要學(xué)會使用。我們前邊講了串口發(fā)送中斷標志位 TI 是硬件置位,軟件清零的。通常來講,我們想一次發(fā)送多個數(shù)據(jù)的時候,就需要把第一個字節(jié)寫入 SBUF,然后再等待發(fā)送中斷,在后續(xù)中斷中再發(fā)送剩余的數(shù)據(jù),這樣我們的數(shù)據(jù)發(fā)送過程就被拆分到了兩個地方——主循環(huán)內(nèi)和中斷服務(wù)函數(shù)內(nèi),無疑就使得程序結(jié)構(gòu)變得零散了。這個時候,為了使程序結(jié)構(gòu)盡量緊湊,在啟動發(fā)送的時候,不是向 SBUF 中寫入第一個待發(fā)的字節(jié),而是直接讓 TI=1,注意,這時候會馬上進入串口中斷,因為中斷標志位置 1 了,但是串口線上并沒有發(fā)送任何數(shù)據(jù),于是,我們所有的數(shù)據(jù)發(fā)送都可以在中斷中進行,而不用再分為兩部分了。大家可以在程序中體會一下這個技巧的好處。

純文本復(fù)制

#include

bit cmdArrived = 0; //命令到達標志,即接收到上位機下發(fā)的命令

unsigned char cmdIndex = 0; //命令索引,即與上位機約定好的數(shù)組編號

unsigned char cntTxd = 0; //串口發(fā)送計數(shù)器

unsigned char *ptrTxd; //串口發(fā)送指針

unsigned char array1[1] = {1};

unsigned char array2[2] = {1,2};

unsigned char array3[4] = {1,2,3,4};

unsigned char array4[8] = {1,2,3,4,5,6,7,8};

void ConfigUART(unsigned int baud);

void main(){

EA = 1; //開總中斷

ConfigUART(9600); //配置波特率為 9600

while (1){

if (cmdArrived){

cmdArrived = 0;

switch (cmdIndex){

case 1:

ptrTxd = array1; //數(shù)組 1 的首地址賦值給發(fā)送指針

cntTxd = sizeof(array1); //數(shù)組 1 的長度賦值給發(fā)送計數(shù)器

TI = 1; //手動方式啟動發(fā)送中斷,處理數(shù)據(jù)發(fā)送

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);

TI = 1;

break;

default:

break;

}

}

}

}

/* 串口配置函數(shù),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 中斷服務(wù)函數(shù) */

void InterruptUART() interrupt 4{

if (RI){ //接收到字節(jié)

RI = 0; //清零接收中斷標志位

cmdIndex = SBUF; //接收到的數(shù)據(jù)保存到命令索引中

cmdArrived = 1;//設(shè)置命令到達標志

}

if (TI){ //字節(jié)發(fā)送完畢

TI = 0; //清零發(fā)送中斷標志位

if (cntTxd > 0){ //有待發(fā)送數(shù)據(jù)時,繼續(xù)發(fā)送后續(xù)字節(jié)

SBUF = *ptrTxd; //發(fā)出指針指向的數(shù)據(jù)

cntTxd--; //發(fā)送計數(shù)器遞減

ptrTxd++; //發(fā)送指針遞增

}

}

}


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉