[英]calculate address from array syntax in c
我知道標題根本不清楚,但是我使用這段代碼來說明我想要問的假設以下簡單代碼:
void example(int *a)
{
for(i = 0 ; i < 20 ; i++)
{
printf(" %d number is %d \n " , i , a[i]);
}
}
int main()
{
int a[20] ;
// assume that the array is filled
example(a);
return 0 ;
}
所以我的問題是,如果我們寫一個[i],那么c語言遵循的“地址模式”是什么? 如果我們只遵循指針的規則或指針的語法,我們必須以這種方式寫一個* a [i],因為我們需要顯示*一個點的值,而不是地址?
簡單的規則是數組不是指針 。 當數組名稱作為參數傳遞給函數時,它們被轉換為指針(在大多數情況下)到它的第一個元素。
不使用[]時會自動執行此操作。 因為指針指向第一個索引(0),所以取消引用數組[1]等也沒有意義。
當您使用括號時,您隱式處理數組的特定元素,因此您無需使用*
來設置其值。
在int *a
, a
是指針。 這意味着它擁有int
的內存地址。 這可以是一個單獨的int
或int
數組的第一個元素。 只有通過指針才能知道。
您可以使用幾個合成器來使用此指針。
通過讀取或寫入*a
,您將處理指針指向的int
變量。 它也可以通過讀取或寫入a[0]
,兩者的意思完全相同。
假設a
點的序列int
變量,有工作a[1]
讓你處理int
存儲旁邊的a[0]
指針類型在內部使用時確定有多少字節旁邊的suceeding int
應在內存中。 它將是sizeof(*a)
bytes next或sizeof(int)
。
而不是a[1]
你也可以使用*(a + 1)
。 這意味着同樣的事情。 這種帶指針的算術運算是可行的,但請注意編譯器會在內部自動將sizeof(int)
乘sizeof(int)
乘以1
,因此在通知存儲在那里的變量類型時不需要冗余。
關於數組下標operator []
,C99標准§6.5.2.1¶2說 -
后綴表達式后跟方括號[]中的表達式是數組對象元素的下標名稱。 下標運算符[]的定義是E1 [E2]與(*((E1)+(E2)))相同。 由於適用於binary +運算符的轉換規則,如果E1是數組對象(等效地,指向數組對象的初始元素的指針)並且E2是整數,則E1 [E2]指定E2的第E2個元素。 E1(從零開始計數)。
因此函數example
a[i]
求值為*(a + i)
。 你可以用任何一種方式寫它。 請注意,數組和指針是不同的類型。 與C
不同,整數不是整數,浮點數,結構等。這意味着您無法將數組傳遞給函數或從函數返回數組。
在函數main
, a
是一個數組類型 - 它的類型是int[20]
,即一個包含20
整數的數組。 當您將a
傳遞給語句中的函數example
時
example(a);
在main
,然后數組a
求值為指向其第一個元素的指針,該元素分配給函數參數a
,類型為int *
。 可以訪問在陣列中的元素a
在main
通過任一語法- a[i]
或*(a + i)
-如在標准中描述的它們是等價的。 但是,請記住,在使用數組本身( main
a[i]
)並使用指向數組中第一個元素的指針( example
a[i]
)時,數組元素的訪問方式存在差異。 有關更多詳細信息,請查看此處 - 解除引用指針和訪問數組元素之間的區別
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.