01數(shù)組的下標(biāo)可以是負(fù)數(shù)
C語(yǔ)言中使用數(shù)組,一般來(lái)說(shuō)都是這樣的:
inta[5]={1,2,3,4, 5}; a[0] = 10;語(yǔ)法規(guī)定,數(shù)組的長(zhǎng)度必須是個(gè)常量,保證數(shù)組所占的內(nèi)存大小不變。數(shù)組下標(biāo)從 0 開(kāi)始,依次往后遞增。于是大部分同學(xué)都把它當(dāng)作了默認(rèn)的規(guī)則。 其實(shí),數(shù)組的長(zhǎng)度可以是0,叫做柔性數(shù)組,目的是讓結(jié)構(gòu)體變成可變長(zhǎng)度,可以參考下面的文章: 數(shù)組的長(zhǎng)度為0會(huì)怎樣? 第二個(gè),數(shù)組的下標(biāo)也可以是負(fù)數(shù),正數(shù)表示向后訪問(wèn),負(fù)數(shù)表示向前訪問(wèn)。比如:
int a[5] = {1, 2, 3, 4, 5}; int *p = &a[2]; p[-2] = 0;如果不太明白,可以看下下面的圖片:

對(duì)于二維數(shù)組,同樣可以使用小于0的下標(biāo)來(lái)訪問(wèn)元素。
intarray[3][3]={{1,2,3},{2,3,4},{3,4,5}}; int(*p)[3]=array+2; printf("%d ",p[-1][-1]);指針p指向數(shù)組的第三行,p[-1]表示第二行的首元素地址,p[-1][-1]表示第二行首元素的前面一個(gè)元素,即第一行最后一個(gè)元素(二維數(shù)組在內(nèi)存中也是連續(xù)的)。

使用負(fù)數(shù)作為下標(biāo)來(lái)訪問(wèn)數(shù)組,切記內(nèi)存不要越界,訪問(wèn)的內(nèi)存一定是存在的,否則會(huì)導(dǎo)致程序奔潰。
02 數(shù)組名可以放在括號(hào)中
由于數(shù)組和指針在使用上是等價(jià)的,數(shù)組可以使用指針來(lái)表示,指針也可以通過(guò)下標(biāo)來(lái)訪問(wèn):
a[i]= 100; *(a+i) = 100; *(i + a) = 100這三行代碼的效果是一樣的。 所以編譯器也支持這樣的用法:
i[a] = 100;放在二維數(shù)組中就是這樣的:
int array[3][3] = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}; printf("%d ",2[array][2]);倒不是推薦這種寫法,筆試題中會(huì)出現(xiàn),認(rèn)識(shí)就行。
03 一個(gè)字節(jié)保存多個(gè)數(shù)據(jù)
可以使用結(jié)構(gòu)體位域來(lái)保存。
struct Test { chara:4; charb:4; };冒號(hào)表示位域,即a只占3位(二進(jìn)制數(shù)),b占5位,結(jié)構(gòu)體一共占了一個(gè)字節(jié)。 對(duì)結(jié)構(gòu)體進(jìn)行初始化:
struct Test t; t.a=1; t.b=3;在內(nèi)存中的布局是這樣的:

如果記錄下結(jié)構(gòu)體的地址,直接訪問(wèn)整個(gè)字節(jié),得到的結(jié)果就是0x31。
struct Test t; t.a=1; t.b=3; char*s=(char*)&t; printf("%x ",*s);
審核編輯:湯梓紅
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7233瀏覽量
90840 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3103瀏覽量
74917 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139953 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
70944 -
數(shù)組
+關(guān)注
關(guān)注
1文章
419瀏覽量
26325
原文標(biāo)題:C語(yǔ)言奇技淫巧:數(shù)組的下標(biāo)可以是負(fù)數(shù) | 一個(gè)字節(jié)可以保存多個(gè)數(shù)據(jù)
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
怎么將一個(gè)字節(jié)數(shù)組放在USAT?
為什么STM32F107 LWIP發(fā)送數(shù)據(jù)都會(huì)丟最后一個(gè)字節(jié)?
寫入一個(gè)字節(jié)到24c02并讀出來(lái)驗(yàn)證

UART 發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)
C語(yǔ)言教程之輸出一個(gè)字符的前驅(qū)字符
C語(yǔ)言教程之使用二維數(shù)組保存數(shù)據(jù)問(wèn)題
關(guān)于UART發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)問(wèn)題的詳細(xì)解析-pdf
如何利用單片機(jī)向PC發(fā)送一個(gè)字節(jié)數(shù)據(jù)
淺談STM32串口通信(一)基本介紹和一個(gè)字節(jié)傳輸?shù)膶?shí)現(xiàn)

UART發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)

評(píng)論