搜尋

首頁  >  問答  >  主體

c++ - 遍历数组时遇到的一基础问题?

int a[] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{

}

这里的a不是代表指针吗?为什么sizeof(a)得到的大小和指针的大小不一样?是因为这个是const指针吗?还是涉及到指针和数组名的本质区别?谢谢大家。

PHP中文网PHP中文网2809 天前753

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-17 15:25:56

    陣列和指標是兩種類型。
    陣列名稱可以隱式轉換為首元素的指標。
    a的類型是int[5]sizeof(a)相當於sizeof(int[5])而不是sizeof(int *)

    回覆
    0
  • 黄舟

    黄舟2017-04-17 15:25:56

    數組指標和普通指標還是有區別的,畢竟在數組定義時,就能確定其元素類型和數量

    只有當編譯器推斷不出是數組還是普通指標時,才會以普通指標的大小計算sizeof
    例如函數聲明,void f(int* a),因為參數a什麼指標都有可能傳入,編譯器不可能推論出是不是數組
    所以sizeof(a) = sizeof(int*)

    但是你題目這種情況,編譯器能明明白白推斷出a就是一個5元整數數組,所以sizeof(a) = sizeof(int[5])

    回覆
    0
  • 迷茫

    迷茫2017-04-17 15:25:56

    簡單講本質區別:
    變數名是對記憶體區域的命名,在運行時是沒有名字的,a和p僅在原始碼和編譯時有意義。
    a命名的記憶體就是 int[5]型別的 有5個int的一塊記憶體。
    p命名的就是具有 int 類型的 只有1個int指標的記憶體空間。
    a[2]在編譯時就直接被翻譯成了 那塊記憶體空間的第3個單元。
    p[2]翻譯成 p那個int*記憶體空間的值取出來,加上2 得到的記憶體位址那個記憶體空間。
    int const p 只是限定p指向的那個只有1個int指標的記憶體空間不可變。

    回覆
    0
  • 取消回覆