陣列中&a與&a[0]的區別
在探討這個問題之前,我們首先來看一道筆試題,如下:
【摘自牛客網】下列程式碼的結果是:(正確答案是 C)
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
A、3,5 B、2,4 C、2,5 D、3,4
下面我們來分析一下選擇C的原因,解釋清楚這個題的正確答案,你就能清楚陣列中&a與&a[0]存在什麼區別了。
題目中首先定義了存放5個int型別空間大小的記憶體,然後初始化5個數。我們知道直接使用陣列的名字a表示的是一個指向陣列首地址的指標,所以直接a與&a[0]是相同的意思,都表示陣列的首地址。所以*(a+1)很好理解,假設a地址是0x1000,就是取(0x1000+sizeof(int))地址的數,由於陣列的實體地址是連續的,當然就是取2。
那&a表示什麼意思呢,相當於取存放指向陣列首地址的指標的儲存地址,話有些繞,但是細細品味你就會發現,它就相當於二維指標,假設每個一維指標指向一排陣列(當然除了第一個一維陣列的指標之外實際都沒有申請,但是在訪問野指標之前計算機也不知道那塊地址是否存在,但的確可以由實體地址連續性來獲取這塊地址的表示),所以簡言之&a表示第一排陣列,&a+1就是表示第二排陣列(就是5*sizeof(int)=5*4=20空間大小後一段空間的首地址)。
有了上面的介紹就好理解了,*(ptr-1)是表示取(0x1000+5*sizeof(int)-sizeof(int))地址中的數,算得為5。
總結:
&a[0]表示陣列的首地址,與直接a相同意義。而&a表示儲存指向陣列首地址的指標的地址,可以用二維指標來理解。
其他二維指標和陣列更詳細說明請閱讀博文:http://blog.csdn.net/fx677588/article/details/69592329
個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
轉載請註明出處:http://blog.csdn.net/FX677588/article/details/74857473
相關文章
- 物件陣列與一般陣列的區別物件陣列
- C#陣列與集合的區別C#陣列
- JS陣列中(for...in)和(for...of)的區別JS陣列
- 詳解資料結構中的“陣列”與程式語言中的“陣列”的區別和聯絡資料結構陣列
- 一維陣列a[5]中&a和a區別陣列
- PHP 中的陣列相加操作以及與 array_merge 之間的區別PHP陣列
- 陣列地址與指標之間的區別與聯絡陣列指標
- golang切片和陣列的區別Golang陣列
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- 【淺出 PHP】陣列相加和陣列合並的區別PHP陣列
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- 128 PHP合併陣列+與array_merge的區別分析PHP陣列
- 字串指標與字元陣列的區別--字串常量的值不能改字串指標字元陣列
- exit(0)與exit(1)、return的區別
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- 面試-陣列和連結串列的區別面試陣列
- JavaScript中0, "", null, false, undefined的區別JavaScriptNullFalseUndefined
- 樹狀陣列的區間查詢與區間修改陣列
- array_merge和+號合併陣列的區別陣列
- 【筆試】陣列、線性表的本質區別筆試陣列
- Python陣列和列表的區別?Python學習教程Python陣列
- 找一個陣列中特別的數陣列
- 自增長列和序列的區別(identity與sequence的區別)IDE
- Javascript中“==”與“===”的區別JavaScript
- Python中 ‘==‘ 與‘is‘的區別Python
- 奇異矩陣與非奇異矩陣的定義與區別矩陣
- C語言中陣列首地址和陣列第一個元素的地址有什麼區別C語言陣列
- Java中(==)與equals的區別Java
- 移除陣列 arr 中的所有值與 item 相等的元素。不要直接修改陣列 arr,結果返回新的陣列陣列
- Java中List與陣列互轉Java陣列
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- Python: 列表、陣列及迭代器切片的區別及聯絡Python陣列
- JavaScript中的+0與-0JavaScript
- 介面和列舉在方法中的區別
- Ruby中的陣列陣列
- Go中的陣列Go陣列
- Java中的陣列Java陣列
- 指標陣列與陣列指標指標陣列
- scala陣列與java陣列對比陣列Java