0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言使用技巧:數(shù)組的下標(biāo)可以是負(fù)數(shù)|一個(gè)字節(jié)可以保存多個(gè)數(shù)據(jù)

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬 ? 作者:學(xué)益得智能硬 ? 2023-01-11 10:32 ? 次閱讀

01數(shù)組的下標(biāo)可以是負(fù)數(shù)

C語言中使用數(shù)組,一般來說都是這樣的:

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

2808c51a-90ca-11ed-bfe3-dac502259ad0.png ?

對于二維數(shù)組,同樣可以使用小于0的下標(biāo)來訪問元素。
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ù)的)。

284eaf80-90ca-11ed-bfe3-dac502259ad0.png

使用負(fù)數(shù)作為下標(biāo)來訪問數(shù)組,切記內(nèi)存不要越界,訪問的內(nèi)存一定是存在的,否則會(huì)導(dǎo)致程序奔潰。

02 數(shù)組名可以放在括號中

由于數(shù)組和指針在使用上是等價(jià)的,數(shù)組可以使用指針來表示,指針也可以通過下標(biāo)來訪問:

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)體位域來保存。
struct Test
{
chara:4;
charb:4;
};
冒號表示位域,即a只占3位(二進(jìn)制數(shù)),b占5位,結(jié)構(gòu)體一共占了一個(gè)字節(jié)。 對結(jié)構(gòu)體進(jìn)行初始化:
struct Test t;
t.a=1;
t.b=3;
在內(nèi)存中的布局是這樣的:

2880698a-90ca-11ed-bfe3-dac502259ad0.png ?

如果記錄下結(jié)構(gòu)體的地址,直接訪問整個(gè)字節(jié),得到的結(jié)果就是0x31。
struct Test t;
t.a=1;
t.b=3;


char*s=(char*)&t;
printf("%x
",*s);

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7028

    瀏覽量

    89034
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3025

    瀏覽量

    74046
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136820
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70562
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25946

原文標(biāo)題:C語言奇技淫巧:數(shù)組的下標(biāo)可以是負(fù)數(shù) | 一個(gè)字節(jié)可以保存多個(gè)數(shù)據(jù)

文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    怎么將一個(gè)字節(jié)數(shù)組放在USAT?

    我看不到將一個(gè)字節(jié)數(shù)組放在USAT上的功能。我該怎么做?也沒有字節(jié)的變量類型嗎?與PIC32的字節(jié)樣,ISUNCORE CHAR?我在網(wǎng)上看過。這似乎不對……所以如果我想在
    發(fā)表于 10-08 06:39

    為什么STM32F107 LWIP發(fā)送數(shù)據(jù)都會(huì)丟最后一個(gè)字節(jié)?

    程序目的:MCU接收網(wǎng)絡(luò)數(shù)據(jù)并處理后,向網(wǎng)絡(luò)返回個(gè)數(shù)組。問題是:每次返回給網(wǎng)絡(luò)的數(shù)據(jù)都會(huì)丟失最后一個(gè)字節(jié),具體見程序,麻煩各位高手給指點(diǎn)
    發(fā)表于 10-16 02:41

    數(shù)組下標(biāo)可以負(fù)數(shù)嗎 ?

    數(shù)組下標(biāo)可以負(fù)數(shù)
    發(fā)表于 09-26 06:45

    寫入一個(gè)字節(jié)到24c02并讀出來驗(yàn)證

    寫入一個(gè)字節(jié)到24c02并讀出來驗(yàn)證 本課的程序已經(jīng)包含了上顆的內(nèi)容,增加了讀
    發(fā)表于 08-09 22:01 ?3162次閱讀
    寫入<b class='flag-5'>一個(gè)字節(jié)</b>到24<b class='flag-5'>c</b>02并讀出來驗(yàn)證

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

    STM32 UART 發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)
    發(fā)表于 12-04 15:10 ?0次下載

    C語言教程之輸出一個(gè)字符的前驅(qū)字符

    C語言教程之輸出一個(gè)字符的前驅(qū)字符,很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-22 17:45 ?0次下載

    C語言教程之使用二維數(shù)組保存數(shù)據(jù)問題

    C語言教程之使用二維數(shù)組保存數(shù)據(jù)問題,很好的C語言
    發(fā)表于 04-25 15:03 ?0次下載

    關(guān)于UART發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)問題的詳細(xì)解析-pdf

    STM32 UART_發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié)
    發(fā)表于 04-10 11:23 ?3次下載

    如何利用單片機(jī)向PC發(fā)送一個(gè)字節(jié)數(shù)據(jù)

    //流水燈控制碼,該數(shù)組被定義為全局變量 /***************************************************** 函數(shù)功能:向PC發(fā)送一個(gè)字節(jié)數(shù)據(jù)
    發(fā)表于 11-23 15:53 ?8037次閱讀

    淺談STM32串口通信()基本介紹和一個(gè)字節(jié)傳輸?shù)膶?shí)現(xiàn)

    文章目錄0 傳輸引腳1 傳輸一個(gè)字節(jié)1.1 發(fā)送一個(gè)字節(jié)1.2 接收一個(gè)字節(jié)2 代碼2.1 配置2.2 發(fā)送一個(gè)字節(jié)2.3 接收一個(gè)字節(jié)0
    發(fā)表于 12-24 18:51 ?14次下載
    淺談STM32串口通信(<b class='flag-5'>一</b>)基本介紹和<b class='flag-5'>一個(gè)字節(jié)</b>傳輸?shù)膶?shí)現(xiàn)

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

    電子發(fā)燒友網(wǎng)站提供《UART發(fā)送數(shù)據(jù)丟失最后一個(gè)字節(jié).pdf》資料免費(fèi)下載
    發(fā)表于 08-01 17:57 ?1次下載
    UART發(fā)送<b class='flag-5'>數(shù)據(jù)</b>丟失最后<b class='flag-5'>一個(gè)字節(jié)</b>

    stm32如何向串口用一個(gè)字節(jié)發(fā)送3300這個(gè)數(shù)

    stm32如何向串口用一個(gè)字節(jié)發(fā)送3300這個(gè)數(shù)? STM32是種嵌入式微控制器,具有高性能,低功耗和低成本等優(yōu)勢。其中,串口通信是嵌入式系統(tǒng)中常用的通訊方式,可以與其他設(shè)備或模塊進(jìn)
    的頭像 發(fā)表于 10-26 11:31 ?821次閱讀

    c語言數(shù)組怎么定義

    : [ ]; 其中, :數(shù)組中元素的數(shù)據(jù)類型,可以是C語言支持的任何數(shù)據(jù)類型,例如整型、字符型、
    的頭像 發(fā)表于 11-24 10:11 ?3088次閱讀

    c語言中多維數(shù)組可以嵌套定義

    C語言中多維數(shù)組可以嵌套定義,這使得我們可以個(gè)數(shù)組
    的頭像 發(fā)表于 11-24 10:18 ?1173次閱讀

    數(shù)組下標(biāo)為什么可以是負(fù)數(shù)

    最近有同學(xué)發(fā)來這樣段代碼,并提出個(gè)問題,數(shù)組下標(biāo)為什么可以是
    的頭像 發(fā)表于 12-20 11:18 ?96次閱讀