[英]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.