关于二维数组取地址加以或减一解引用问题
很顯然aa是一個二維數組,很多人把二維數組抽象的理解成一個矩陣,如
[1,2,3,4,5], [6,7,8,9,10],不能說這是錯誤,這種思維不利于對二維數組更好地理解,那我們該怎么理解呢?維度是空間的一個概念,我們可以抽象的理解為二維空間是由一維空間組成,三維空間是由二維空間組成,同理,二維數組,其實是由多個一維數組組成的,這個二維數組是兩行五列,就是說這個二維數組是由2個元素個數為5的一維數組組成,設這兩個一維數組為b[5],c[5],令b[5]={1,2,3,4,5},c[5]={6,7,8,9,10}。接下來開始分析代碼:
int *ptr1 = (int *)(&aa + 1);這個&aa+1怎么理解呢?&aa指二維數組aa的地址,&aa+1就是指向下一個數組的首地址(在這里我們可以形象的理解為元素aa[2][5]的地址,很顯然aa[2][5]已經越界了,這里只是便于理解而特殊引用的),然后將其進行int*強制轉換賦給ptr1。
int *ptr2 = (int *)(*(aa + 1));aa在單獨使用時代表數組aa的首地址,加一表示首地址加一,即指向下一個元素地址,即第二個元素地址(即c[5]的地址,同樣代表c[0]地址),再將其解引用后強制轉換為int*型賦給ptr2。
printf("%d,%d", *(ptr1 - 1),*(ptr2 - 1));ptr1-1就表示下一個數組首元素aa[2][5]的前一個元素的地址,即本數組最后一個元素aa[2][4]的地址,解引用后就是10;ptr2表示c[5]的地址,也是c[0]的地址,減一表示指向前一個數組最后一個元素的地址,即b[4]的地址,解引用后就是5。
總結
以上是生活随笔為你收集整理的关于二维数组取地址加以或减一解引用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法复习第三章分治法
- 下一篇: QT5 exec()模态显示子对话框,父