int a[] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
}
这里的a不是代表指针吗?为什么sizeof(a)
得到的大小和指针的大小不一样?是因为这个是const指针吗?还是涉及到指针和数组名的本质区别?谢谢大家。
迷茫2017-04-17 15:25:56
陣列和指標是兩種類型。
陣列名稱可以隱式轉換為首元素的指標。 a
的類型是int[5]
,sizeof(a)
相當於sizeof(int[5])
而不是sizeof(int *)
。
黄舟2017-04-17 15:25:56
數組指標和普通指標還是有區別的,畢竟在數組定義時,就能確定其元素類型和數量
只有當編譯器推斷不出是數組還是普通指標時,才會以普通指標的大小計算sizeof
例如函數聲明,void f(int* a)
,因為參數a
什麼指標都有可能傳入,編譯器不可能推論出是不是數組
所以sizeof(a) = sizeof(int*)
但是你題目這種情況,編譯器能明明白白推斷出a
就是一個5元整數數組,所以sizeof(a) = sizeof(int[5])
迷茫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指標的記憶體空間不可變。