如何理解指針與數(shù)組的關(guān)系 隊(duì)列,堆棧與數(shù)組,鏈表的關(guān)系與區(qū)分?
隊(duì)列,堆棧與數(shù)組,鏈表的關(guān)系與區(qū)分?堆棧和隊(duì)列都可以用數(shù)組和鏈表來(lái)實(shí)現(xiàn)!廣義來(lái)說(shuō),棧也是隊(duì)列!兩者都是順序表結(jié)構(gòu)!棧也叫FIFO隊(duì)列,也可以叫LIFO隊(duì)列,隊(duì)列也叫FIFO隊(duì)列!這兩個(gè)統(tǒng)稱為單輸入單輸
隊(duì)列,堆棧與數(shù)組,鏈表的關(guān)系與區(qū)分?
堆棧和隊(duì)列都可以用數(shù)組和鏈表來(lái)實(shí)現(xiàn)!廣義來(lái)說(shuō),棧也是隊(duì)列!兩者都是順序表結(jié)構(gòu)!
棧也叫FIFO隊(duì)列,也可以叫LIFO隊(duì)列,隊(duì)列也叫FIFO隊(duì)列!這兩個(gè)統(tǒng)稱為單輸入單輸出隊(duì)列!
堆棧屬于單端隊(duì)列!隊(duì)列是單進(jìn)單出的,d:堆棧(LIFO或FILO)、隊(duì)列(FIFO)和雙入雙出隊(duì)列(deque)是隊(duì)列的三種形式。Stack是單端隊(duì)列,先入后出!單輸入單輸出隊(duì)列的D
指針數(shù)組?
如果指針數(shù)組* str[5] { "jjjjj ", "kkhjfg ", "jkjgh ", "kjjjk "和 "llljg "}被使用,為什么這里的str[i]代表每個(gè)字符串,為什么可以作為函數(shù)參數(shù)?望指教!
可以調(diào)試一下看看:
命名變量str指向內(nèi)存地址,該地址是指針數(shù)據(jù)的第一個(gè)地址;
str[0]的值是數(shù)組中第一個(gè)字符串的第一個(gè)地址;
str[1]的值是數(shù)組中第二個(gè)字符串的第一個(gè)地址;
您可以通過(guò)調(diào)試來(lái)查看這些命名變量的地址。
不看內(nèi)存地址怎么理解指針?
指針的本質(zhì)是一個(gè)地址的解釋!
Char*編譯器將A指向的地址解釋為字符。
假設(shè)A指向內(nèi)存地址0x0001,地址0x0001存儲(chǔ)0x61 0x62 0x63。編譯器如何解釋*a?
編譯器會(huì)看到a的類型是char,也就是只看這個(gè)地址的1個(gè)字節(jié),所以編譯器解釋* a a.
指針類型是告訴編譯器如何解釋指針變量值所指向的地址。
一直沒(méi)明單片機(jī)C語(yǔ)言的指針這塊內(nèi)容,在什么情況下會(huì)用到指針呢?
作為一個(gè)長(zhǎng)期使用C語(yǔ)言的,我來(lái)回答一下C語(yǔ)言指針的問(wèn)題。
首先,C語(yǔ)言指針的本質(zhì)是什么?C語(yǔ)言指針的本質(zhì)是內(nèi)存變量,也就是內(nèi)存單元的個(gè)數(shù)。存儲(chǔ)單元以字節(jié)為單位。所以指針是字節(jié)數(shù)。如下圖所示,一個(gè)4G內(nèi)存的編號(hào),指針的值其實(shí)就是內(nèi)存編號(hào)。
其次,明確了變量和指針的關(guān)系對(duì)應(yīng)的是具體的內(nèi)存,變量的內(nèi)容就是內(nèi)存中存儲(chǔ)的數(shù)字。根據(jù)。
比如我們定義一個(gè)變量uint8_t a10,如果a的位置是0,也就是上圖中0的位置存儲(chǔ)在內(nèi)存中的數(shù)據(jù)是10;
讓 讓我們?cè)倏纯粗羔?,定義指針uint8_t * ba。我們知道含義是取地址,那么根據(jù)上面假設(shè)變量A位于地址0,那么A就是0,指針變量B的值就是0。
如果你不 不理解指針定義uint8_t * ba,我們可以做一個(gè)改動(dòng):
(uint8_t *) b a,很容易理解(uint8_t *)是一種新的數(shù)據(jù)類型。事實(shí)上,在我們實(shí)際的編程中,通常將其定義為typeof uint8_t * uint8_p _ p。
uint8_p b
這樣,B更像一個(gè)變量,更容易理解。
第三,指針單元和內(nèi)存指針。每個(gè)單元代表多少內(nèi)存?這取決于指針的類型。
比如char * a,short int * b,int * c,long int * d等。
指針指的是每個(gè)內(nèi)存的編號(hào),有1字節(jié),2字節(jié),4字節(jié),8字節(jié),也就是每個(gè)變量類型占用的內(nèi)存單元。
假設(shè)A、B、C、D四個(gè)指針的變量值都是100。自加后指針的值是多少?
a;
b;
c;
d;
你能猜出a,b,c,d的值是多少嗎?
答案是:101,102,104,108。
也就是指針每次移動(dòng)對(duì)應(yīng)一個(gè)變量類型的內(nèi)存量,這個(gè)可以通過(guò)keil開(kāi)發(fā)環(huán)境上的仿真環(huán)境來(lái)驗(yàn)證,有興趣的可以自己驗(yàn)證。
最后,指針的優(yōu)勢(shì)和應(yīng)用場(chǎng)景:1。效率高;2.靈活,可以在任何位置訪問(wèn)內(nèi)存數(shù)據(jù);3.作為函數(shù)參數(shù),只需要傳遞4個(gè)字節(jié),比數(shù)組值傳遞節(jié)省內(nèi)存復(fù)制時(shí)間。
應(yīng)用場(chǎng)景:1。交換函數(shù)中兩個(gè)變量的值。
學(xué)習(xí)一個(gè)函數(shù)的時(shí)候,交換兩個(gè)數(shù)的值,做一個(gè)swap函數(shù),傳入值,或者交換兩個(gè)值,沒(méi)問(wèn)題,但是沒(méi)有swap就沒(méi)用了。為什么?因?yàn)閭魅肓藘蓚€(gè)值。如果指針被傳遞就沒(méi)有問(wèn)題。因?yàn)橹羔槀鬟f了兩個(gè)變量的地址,所以變量的位置保持不變。
2.該函數(shù)通過(guò)指針?lè)祷囟鄠€(gè)值。
3.函數(shù)返回操作的狀態(tài),結(jié)果通過(guò)指針?lè)祷亍?/p>
…………
指針的缺點(diǎn)指針是C語(yǔ)言的靈魂。一般來(lái)說(shuō),C語(yǔ)言是a "低級(jí) "語(yǔ)言,這也很大程度上是因?yàn)镃語(yǔ)言指針的問(wèn)題。c語(yǔ)言指針允許開(kāi)發(fā)人員在任何內(nèi)存位置訪問(wèn)數(shù)據(jù)。這是其他聲音可以做到的。;無(wú)法實(shí)現(xiàn)。正是因?yàn)橛辛酥羔?,C語(yǔ)言也容易出錯(cuò)。最常見(jiàn)的問(wèn)題是地址越界。如果地址越界,讀寫(xiě)一些不該讀寫(xiě)的東西會(huì)直接導(dǎo)致系統(tǒng)崩潰,這個(gè)問(wèn)題很難定位,因?yàn)檎Z(yǔ)法上是這樣的沒(méi)有編譯時(shí)檢測(cè)不到的錯(cuò)誤。
如果對(duì)C語(yǔ)言的指針有什么意見(jiàn),歡迎留言討論。