我有以下程序.但是,我无法理解为什么我必须传递数组的地址.当他们都指向同一个地址时.这是int数组的第一个元素的地址.
当我尝试执行"从不兼容的指针类型分配"时,我收到警告:
ptr = var;
Run Code Online (Sandbox Code Playgroud)
完整源代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我编译代码 gcc 4.4.4 c89 -Wall -Wextra -O0
CB *_*ley 20
这纯粹是一个类型问题.
在大多数表达式上下文中,数组的名称(例如var)衰减到指向数组的初始元素的指针,而不是指向数组的指针.[注意,这并不意味着它var是一个指针 - 它不是一个指针 - 它的行为就像一个指向大多数表达式中数组的第一个元素的指针.
这意味着在表达式中var通常会衰减到指向a的指针int,而不是指向数组的指针int.
由于address-of operator(&)的操作数是一个不应用此衰减规则的上下文(另一个作为运算sizeof符的操作数).在这种情况下,类型&var直接从类型派生,var因此类型是指向数组5的指针int.
是的,指针具有相同的地址值(数组的第一个元素的地址是数组本身的地址),但它们具有不同的类型(int*vs int(*)[5]),因此在赋值中不兼容.
ISO/IEC 9899:1999 6.3.2.1/4:
除非它是运算
sizeof符或一元运算&符的操作数,或者是用于初始化数组的字符串文字,否则类型为"array of type "的表达式将转换为"指向类型的指针"类型的表达式,指向数组对象的初始元素,而不是左值....
var它本身是(*int)指向数组中第一个元素的指针。C 中的指针和数组极其相似。更改int (*ptr)[5] = NULL;为int* ptr = NULL;和ptr = &var;到ptr = var;