←↑→↓↖↙↗↘??
unicode=Geometric Shapes
? 僅僅個別字不同的時候的對比標(biāo)識
◆
? 著重強調(diào)
??◆ 1弹澎、
??◆ 2、
??◆ 3、
??
??
??
??
??
??
??
??
Miscellaneous Symbols
?
Dingbats
? 重點記憶侥啤,個人總結(jié)的點,或者知識茬故。
??
?
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運行查看內(nèi)存:
??數(shù)組首地址為0x00d5fd5c盖灸,因為一個int占4字節(jié), 3個int就是12字節(jié)均牢,等于0x0c糠雨。
??0x00d5fd5c+0x0c=0x00d5fd68正好等于a[1]。a[2]的值計算方式相同徘跪。
??結(jié)論:a[0]甘邀、a[1]、a[2]垮庐,各為二維數(shù)組第一維的起始地址松邪。
??需要注意的點:
??
??如何驗證呢?寒亥?
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輸出值相同溉奕,但是卻代表不同含義褂傀。
??下圖簡要的標(biāo)識了兩者之間的不同關(guān)系。
??回顧一維數(shù)組的取值方式:
??明確:
??1加勤、二維數(shù)組仙辟,要取值,要使用2對[ ][ ]
符號鳄梅。
??2叠国、從一維數(shù)組來說,方括號[ ]
和星號*
的作用相同戴尸。一維數(shù)組要取值粟焊,要么表達式使用[ ]
,要么使用*
孙蒙。
??3项棠、從二維數(shù)組來說,常規(guī)使用2對[ ][ ]
,上所述[ ]
和*
作用相同,所以理論上二維數(shù)組取值可以使4種方式:
??下面使用程序進行驗證四種方式:
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
??到目前為止嚎花,情況一切都很美好桑包,但是,還不夠全面皆尔。
??只驗證了第一維的第一個元素,后面的情況如何?
??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、[ ]*式 ( [ ] 在括號內(nèi)岖圈,先進行運算 )
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é)果。對比數(shù)組的定義如下:
int a[3][3]= { {1,2,3},{6,5,4},{7,8,9}};
??出現(xiàn)的結(jié)果蚓耽,變成了3個維度的第一個元素渠牲。這和預(yù)計的初衷不同。
??反思問題在哪步悠?對的签杈,應(yīng)該是 運算符優(yōu)先級。
??根據(jù)c語言語法贤徒,這個表達式中芹壕,各運算的優(yōu)先級為:
??這意味著:
??原本初衷是訪問第一維的3個元素,針對這個需求接奈,如何修改代碼踢涌?
??根據(jù)上表邏輯和原本需求,要訪問第一維的3個元素序宦,需要取值表達式的[ ]符號作為這個表達式的最后一個執(zhí)行的部分睁壁,或者說,需要把基址“固定住”互捌。
??或者說潘明,既然是因為優(yōu)先級導(dǎo)致的問題,那么就從改變優(yōu)先級入手,添加一對括號:
??這意味著:下面再看上表的計算過程:
??使用程序輸出驗證:
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