基礎(chǔ)C++教學(xué)??009【C中通過指針引用多維數(shù)組】2019-12-22

←↑→↓↖↙↗↘??
unicode=Geometric Shapes
? 僅僅個(gè)別字不同的時(shí)候的對(duì)比標(biāo)識(shí)

? 著重強(qiáng)調(diào)

??◆ 1、
??◆ 2、
??◆ 3、

??
??
??
??
??
??
??
??

Miscellaneous Symbols

?
Dingbats
? 重點(diǎn)記憶,個(gè)人總結(jié)的點(diǎn),或者知識(shí)。
??
?

    int a[3][3]= { {1,2,3},{6,5,4},{7,8,9}};

    printf("a[0]=%x\n",a[0]);
    printf("a[1]=%x\n",a[1]);
    printf("a[2]=%x\n",a[2]);

    printf("%c",'\n');

    printf("a=%x\n",a);
    printf("a+0=%x\n",a+0);
    printf("a+1=%x\n",a+1);
    printf("a+2=%x\n",a+2);
a[0]=61fedc
a[1]=61fee8
a[2]=61fef4

a=61fedc
a+0=61fedc
a+1=61fee8
a+2=61fef4

??用visual studio運(yùn)行查看內(nèi)存:

??數(shù)組首地址為0x00d5fd5c,因?yàn)橐粋€(gè)int占4字節(jié), 3個(gè)int就是12字節(jié),等于0x0c。
??0x00d5fd5c+0x0c=0x00d5fd68正好等于a[1]。a[2]的值計(jì)算方式相同。
??結(jié)論:a[0]、a[1]、a[2],各為二維數(shù)組第一維的起始地址。

??需要注意的點(diǎn):
??a[0]=61fedc 和 a+0=61fedc,值相同,但是含義相同嗎?
??如何驗(yàn)證呢??

    printf("a[0]+1=%x\n",a[0]+1);
    printf("a+0+1=%x\n",a+0+1);
a[0]+1=61fee0
a+0+1=61fee8

??根據(jù)地址輸出,可以看到同樣都執(zhí)行了操作+1,但是得出的結(jié)果卻不同,這說明了雖然a[0]和a+1輸出值相同,但是卻代表不同含義。
??下圖簡(jiǎn)要的標(biāo)識(shí)了兩者之間的不同關(guān)系。

??回顧一維數(shù)組的取值方式:

??明確:

??1、二維數(shù)組,要取值,要使用2對(duì)[ ][ ]符號(hào)。

??2、從一維數(shù)組來說,方括號(hào)[ ]和星號(hào)*的作用相同。一維數(shù)組要取值,要么表達(dá)式使用[ ],要么使用*。

??3、從二維數(shù)組來說,常規(guī)使用2對(duì)[ ][ ],上所述[ ]*作用相同,所以理論上二維數(shù)組取值可以使4種方式:

??下面使用程序進(jìn)行驗(yàn)證四種方式:

     printf("a[0][0]=%x\n",a[0][0]);
     printf("*(a[0]+0)=%x\n",*(a[0]+0));
     printf("*(a+0)[0]=%x\n",*(a+0)[0]);
     printf("*(*(a+0)+0)=%x\n",*(*(a+0)+0));
a[0][0]=1
*(a[0]+0)=1
*(a+0)[0]=1
*(*(a+0)+0)=1

??到目前為止,情況一切都很美好,但是,還不夠全面。
??只驗(yàn)證了第一維的第一個(gè)元素,后面的情況如何?
??1、[ ][ ]式

    printf("a[0][0]=%x\n",a[0][0]);
    printf("a[0][1]=%x\n",a[0][1]);
    printf("a[0][2]=%x\n",a[0][2]);
a[0][0]=1
a[0][1]=2
a[0][2]=3

??2、[ ]*式 ( [ ] 在括號(hào)內(nèi),先進(jìn)行運(yùn)算 )

    printf("*(a[0]+0)=%x\n",*(a[0]+0));
    printf("*(a[0]+1)=%x\n",*(a[0]+1));
    printf("*(a[0]+2)=%x\n",*(a[0]+2));
*(a[0]+0)=1
*(a[0]+1)=2
*(a[0]+2)=3

??3、* *式

    printf("*(*(a+0)+0)=%x\n",*(*(a+0)+0));
    printf("*(*(a+0)+1)=%x\n",*(*(a+0)+1));
    printf("*(*(a+0)+2)=%x\n",*(*(a+0)+2));
*(*(a+0)+0)=1
*(*(a+0)+1)=2
*(*(a+0)+2)=3

??4、* [ ]式

    printf("*(a+0)[0]=%x\n",*(a+0)[0]);
    printf("*(a+0)[1]=%x\n",*(a+0)[1]);
    printf("*(a+0)[2]=%x\n",*(a+0)[2]);
*(a+0)[0]=1
*(a+0)[1]=6
*(a+0)[2]=7

??嗯。?????

??這???出現(xiàn)了超出預(yù)期的結(jié)果。對(duì)比數(shù)組的定義如下:

int a[3][3]= { {1,2,3},{6,5,4},{7,8,9}};

??出現(xiàn)的結(jié)果,變成了3個(gè)維度的各第一個(gè)元素。這和預(yù)計(jì)的初衷不同。
??反思問題在哪?對(duì)的,應(yīng)該是 運(yùn)算符優(yōu)先級(jí)
??根據(jù)c語(yǔ)言語(yǔ)法,*(a+0)[0]這個(gè)表達(dá)式中,各運(yùn)算的優(yōu)先級(jí)為:

??這意味著:

??原本初衷是訪問第一維的3個(gè)元素,針對(duì)這個(gè)需求,如何修改代碼?
??根據(jù)上表邏輯和原本需求,要訪問第一維的3個(gè)元素,需要取值表達(dá)式的[ ]符號(hào)作為這個(gè)表達(dá)式的最后一個(gè)執(zhí)行的部分,或者說,需要把基址“固定住”。
??或者說,既然是因?yàn)閮?yōu)先級(jí)導(dǎo)致的問題,那么就從改變優(yōu)先級(jí)入手,添加一對(duì)括號(hào):

??這意味著:下面再看上表的計(jì)算過程:

??使用程序輸出驗(yàn)證:

    printf("(*(a+0))[0]=%x\n",(*(a+0))[0]);
    printf("(*(a+0))[1]=%x\n",(*(a+0))[1]);
    printf("(*(a+0))[2]=%x\n",(*(a+0))[2]);
(*(a+0))[0]=1
(*(a+0))[1]=2
(*(a+0))[2]=3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,619評(píng)論 3 44
  • 謹(jǐn)記 每個(gè)人心中都有一片海,自己不揚(yáng)帆,沒人幫您啟航,久了就是一片死海。人生,就是一場(chǎng)自己與自己的較量:讓積極打敗...
    長(zhǎng)風(fēng)留言閱讀 8,157評(píng)論 6 10
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,690評(píng)論 1 51
  • 數(shù)組在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 4,281評(píng)論 2 13
  • 第十章 指針 1. 地址指針的基本概念: 在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的。一般把存儲(chǔ)器中的一個(gè)字節(jié)稱為...
    堅(jiān)持到底v2閱讀 1,170評(píng)論 2 3

友情鏈接更多精彩內(nèi)容