回覆列表
  • 1 # 羅馬鮮生

    靜看電影 共享好時光

    簡單說

    arr本身不是一個指標變數,不像一個指標需要另外的空間儲存,所以arr本身用&取地址是沒有意義的,或者說是不需要這個意義的,但是為了方便一些情況,規定&arr等於arr,也有覺得是&arr才是地址,arr才是強行規定等於&arr

    詳細說一下

    arr是陣列的開始地址,但是&arr不是地址的地址,&arr也是陣列的開始地址它們值相同,型別不同,你的邏輯錯在了沒有全面理解C的型別系統和隱式轉換規律

    複雜回答:弄懂這個問題需要你瞭解C的型別系統和隱式轉換的規律首先,你要知道什麼是隱式轉換,這個不解釋瞭然後,C語言是存在陣列型別的,對沒錯是陣列型別,而這個型別在大多數情況下會隱式轉換為它的元素的指標型別,

    所以你定義了一個數組int arr[10],arr的型別實際上是int[10],但是因為大部分情況下的隱式轉換,arr的型別會退化為int*大部分情況下都會發生隱式轉換,不會發生隱式轉換的情況有三個,sizeof運算的時候,取地址(&)運算的時候,字串常量初始化時

    這也就是為什麼sizeof陣列是整個陣列的長度,不等於sizeof指標,在此我不想討論C為什麼要做這麼多隱式轉換。上面說&運算的時候不會發生隱式轉換,所以&arr,就是取arr陣列的地址,取陣列的地址,在這裡,既不是陣列名的地址,也不是陣列首元素的地址,arr就是陣列,&arr就是取陣列的地址,也就是整個陣列在記憶體中的第一個位置的地址,這個運算結果的型別是陣列的指標,也就是int(*)[10]。

    arr的值在很多情況下會隱式轉換為首元素地址,所以你在問題描述裡就認為它就是首元素地址(但其實不是)&arr是陣列的地址,碰巧和首元素地址相同但是他們型別不同,一個是int[10]隱式轉換成的int*,另一個是int(*)[10]

    靜看電影 共享好時光

    如果我的答案對您有一點點幫助的話 請關注噢 看到你的支援我會很開心的

  • 2 # 鄰牧

    arr本身不是一個指標變數,不像一個指標需要另外的空間儲存,所以arr本身用&取地址是沒有意義的,或者說是不需要這個意義的,但是為了方便一些情況,規定&arr等於arr,也有覺得是&arr才是地址,arr才是強行規定等於&arr

  • 中秋節和大豐收的關聯?
  • 有推薦哪家的簡訊介面做得不錯的嗎?