void print_array(int(*p)[10], int len)
{
for (int i = 0; i < len; i )
{
printf("%d ", (*p)[i]);
}
}
int main()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i )
{
arr[i] = i;
}
int(*p)[10] = arr;
print_array(p,len);
return 0;
}
為什么print_array函式的代碼可以列印陣列的資訊?我沒有意識到代碼,(*p)[i]
所以我希望程式員大師可以幫助我解決這個問題。
我想我不理解這段代碼的原因是我沒有意識到陣列指標的知識。
uj5u.com熱心網友回復:
讓我們從這條線開始
int(*p)[10] = arr;
arr
用作初始化器的陣列被隱式轉換為指向其型別的第一個元素的指標int *
。
但是,初始化的指標p
具有型別int ( * )[10]
,并且這兩個指標之間沒有隱式轉換。
所以編譯器應該至少發出一個警告。
你必須寫
int(*p)[10] = &arr;
另一方面,運算式arr
和的值&arr
彼此相等。它是陣列占用的記憶體范圍的初始地址。(陣列第一個元素的地址等于整個物件的陣列地址)。
因此該函式接受指向int ( * )[10]
陣列的型別的指標。
取消參考運算式中的指標,(*p)
您將獲得一個型別的物件int[10]
(指標指向的陣列),它是陣列型別的物件。
因此,您可以應用下標運算子(*p)[i]
來訪問陣列的元素。
uj5u.com熱心網友回復:
p
是指向 10 元素int
陣列的指標。
(*p)[i]
首先,取消參考指標p
并獲得 10 個整數的陣列。然后訪問i
陣列的第 th 個元素。
uj5u.com熱心網友回復:
array 是傳染性記憶體分配,因此陳述句int(*p)[10] = arr;
創建了一個指標陣列,其中 p[0] 指向陣列的第一個元素。
現在在函式呼叫中,*p[i] 導致 *(p i),i 繼續遞增,因此它將繼續列印陣列元素 1st、2nd、3rd 等等
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506454.html
上一篇:c#記憶體池有什么意義?[復制]