簡體   English   中英

為什么我不能直接在C中為指針分配數組?

[英]Why can't I assign an array to pointer directly in C?

我有以下程序。 但是,我無法理解為什么我必須傳遞數組的地址。 當他們都指向同一個地址時。 這是int數組的第一個元素的地址。

當我嘗試執行“從不兼容的指針類型分配”時,我收到警告:

ptr = var;

完整源代碼:

void print_values(int (*ptr)[5])
{
    size_t i = 0;
    for(i = 0; i < 5; i++) {
        printf("%d: [ %d ]\n", i, (*ptr)[i]);
    }
}

int main(void)
{
    /* declare a pointer to an array integers */
    int (*ptr)[5] = NULL;
    /* array of integers */
    int var[] = {1, 2, 3, 4, 5};
    /* assign the address of where the array is pointing to (first element) */
    ptr = &var;
    /* Both are pointing to the exact same address */
    printf("var  [ %p ]\n",(void*)var);
    printf("&var [ %p ]\n", (void*)&var);

    print_values(ptr);
    return 0;
}

我用gcc 4.4.4 c89 -Wall -Wextra -O0編譯代碼

這純粹是一個類型問題。

在大多數表達式上下文中,數組的名稱(例如var )衰減到指向數組的初始元素的指針,而不是指向數組的指針。 [注意,這並不意味着var是一個指針 - 它不是一個指針 - 它的行為就像一個指向大多數表達式中數組的第一個元素的指針。

這意味着在表達式var通常會衰減到指向int的指針,而不是指向int數組的指針。

由於運算符地址( & )的操作數是一個不應用此衰減規則的上下文(另一個作為sizeof運算符的操作數)。 在這種情況下, &var的類型直接從var的類型派生,因此類型是指向5 int數組的指針。

是的,指針具有相同的地址值(數組的第一個元素的地址是數組本身的地址),但它們有不同的類型( int* vs int(*)[5] )因此在分配。

ISO / IEC 9899:1999 6.3.2.1/4:

除非它是sizeof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則將類型為“array of type ”的表達式轉換為類型為“指向類型的指針”的表達式指向數組對象的初始元素,而不是左值。 ...

C是一種強類型語言。 當函數需要int *類型的參數時,必須傳遞int *類型的參數。 不是double * ,不是char * ,而是int * 即使那些double *char *的實際數字地址與你想要傳遞的那個“相同”,它仍然不會改變任何東西 - 你仍然必須傳遞一個int * 該語言禁止您傳遞錯誤類型的值。

這正是你的情況。 該函數采用int (*)[5]類型的參數。 這意味着您必須傳遞該類型的參數。 不允許傳遞int * 地址是否相同也沒有區別。

var本身是一個(*int)指向數組中的第一個元素。 C中的指針和數組非常相似。 改變int (*ptr)[5] = NULL; to int* ptr = NULL; ptr = &var; ptr = var;

從我可以告訴你的是將數組指針( var )分配給指向數組指針的指針( (*ptr)[5] ),這就是你得到那個警告的原因。

相反,嘗試使用

int *ptr = NULL;

暫無
暫無

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

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