最近有同學(xué)發(fā)來這樣一段代碼,并提出一個(gè)問題,數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)?
#includeint main() { const char *s = "helloworld"; const char *p = s + 5; printf("%c ", p[-2]); return 0; }
關(guān)鍵是這段代碼,編譯運(yùn)行都很順利。
首先需要搞懂下標(biāo)的作用是什么,準(zhǔn)確的說,它是個(gè)偏移量。
比如 a[3],數(shù)組名 a 作為數(shù)組首元素地址,下標(biāo) 3 表示從這個(gè)地址開始向后移動(dòng) 3 個(gè)元素,至于具體是幾個(gè)字節(jié),得看什么元素。
所以 a[3] 完全等價(jià)于 *(a + 3),甚至把代碼寫成 3[a] 編譯器也沒意見,表示的都是一個(gè)意思。
如果把數(shù)組下標(biāo)寫成負(fù)數(shù),就表示向前偏移。
a[-1] 就是向前偏移一個(gè)元素,很顯然,前面這塊內(nèi)存不屬于數(shù)組,不能這樣使用,所以很少見到數(shù)組下標(biāo)是負(fù)數(shù)的。
但是對(duì)于這樣精心設(shè)計(jì)過的代碼,保證內(nèi)存不會(huì)越界的情況下,完全沒有問題。
s 指向了字符 h,p 指向了字符 w,p[-2] 就是往前數(shù)兩個(gè)元素,所以打印出來的就是 l。
-
代碼
+關(guān)注
關(guān)注
30文章
4838瀏覽量
69139 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26035
原文標(biāo)題:數(shù)組的下標(biāo)可不可以是負(fù)數(shù)
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用ADS8341時(shí),其COM腳可以接負(fù)電壓?jiǎn)幔畲?b class='flag-5'>可以是多少?
dac5686的IOVDD可以是2.5V嗎?
數(shù)組名之間可以直接賦值嗎
指針數(shù)組和二維數(shù)組有沒有區(qū)別
C語言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組
如何在文本字段中使用上標(biāo)、下標(biāo)及變量
![如何在文本字段中使用上標(biāo)、<b class='flag-5'>下標(biāo)</b>及變量](https://file1.elecfans.com//web1/M00/F4/DC/wKgaoWcy2N-AeA-xAAE3VhR0Bd8575.png)
TLV320AIC3254的輸入斷開,采集噪聲數(shù)據(jù)均為負(fù)數(shù)還能聽到噪聲,請(qǐng)問負(fù)數(shù)的底噪是如何產(chǎn)生的?
labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組
解析嵌入式編程8種常用的數(shù)據(jù)結(jié)構(gòu)
![解析嵌入式編程8種常用的數(shù)據(jù)結(jié)構(gòu)](https://file1.elecfans.com/web2/M00/D1/84/wKgZomYjLfWAVvsoAADNuHyUPOg650.png)
用PWM+DMA,然后用DAC輸出,可以是觸發(fā)輸出嗎?
深入探索KUKA KRL中的數(shù)組應(yīng)用
![深入探索KUKA KRL中的<b class='flag-5'>數(shù)組</b>應(yīng)用](https://file1.elecfans.com/web2/M00/CC/61/wKgZomYgh_6AQodBAAAc_c8kLRY926.png)
鴻蒙TypeScript學(xué)習(xí)第17天:【對(duì)象】
![鴻蒙TypeScript學(xué)習(xí)第17天:【對(duì)象】](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
評(píng)論