簡體   English   中英

從c中的數組語法計算地址

[英]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 *aa是指針。 這意味着它擁有int的內存地址。 這可以是一個單獨的intint數組的第一個元素。 只有通過指針才能知道。

您可以使用幾個合成器來使用此指針。

通過讀取或寫入*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不同,整數不是整數,浮點數,結構等。這意味着您無法將數組傳遞給函數或從函數返回數組。

在函數maina是一個數組類型 - 它的類型是int[20] ,即一個包含20整數的數組。 當您將a傳遞給語句中的函數example

example(a);

main ,然后數組a求值為指向其第一個元素的指針,該元素分配給函數參數a ,類型為int * 可以訪問在陣列中的元素amain通過任一語法- a[i]*(a + i) -如在標准中描述的它們是等價的。 但是,請記住,在使用數組本身( main a[i] )並使用指向數組中第一個元素的指針( example a[i] )時,數組元素的訪問方式存在差異。 有關更多詳細信息,請查看此處 - 解除引用指針和訪問數組元素之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM