这是ISO 的要点:标准转换:数组到指针转换:$ 4.2.1
“数组”类型的左值或右值 N T“或”未知界限的数组 T“可以转换为右值 类型“指向T的指针”结果是 指向第一个元素的指针 数组。
任何人都可以解释这一点,如果可能,请使用示例程序。
我已经看过这些链接,但我无法理解:
I think I may have come up with an example of rvalue of array type
答案 0 :(得分:10)
在C和C ++中,可以使用数组,就好像它是指向第一个元素的指针一样。实际上,给定一个名为x
的数组,您可以用&x[0]
替换x
的大多数用途。
这就是订阅如何与数组对象一起使用:
int x[5];
x[2]; // this is the same as (&x[0])[2]
这也是如何将数组传递给具有指针类型参数的函数:
void f(int* p);
int x[5];
f(x); // this is the same as f(&x[0])
有几种情况下不会发生数组到指针的转换。示例包括当数组是sizeof
或一元 - &
(地址运算符)的操作数时,当使用字符串文字来初始化数组时,以及当数组绑定到数组时引用数组。
答案 1 :(得分:1)
int a[6];
int *b = a;
指针b指向a [0],即包含元素a [0]的地址。
答案 2 :(得分:0)
这方面的一个例子是,当传递给一个接受数组类型指针的函数时,任何数组变量都会自动退化为指向它的第一个元素的指针。
从Arrays and Pointers的C-Faq看一下这一节。这同样适用于C ++。
void foo(int *a) {
a[0] = 1;
}
int main(void) {
int b[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foo(b);
printf("b[0] == %d\n", b[0]);
}
答案 3 :(得分:0)
这意味着您可以遇到以下情况:
int arr[100];
arr[ 0 ] = arr[ 1 ] = 666;
// ..
您可以使用arr
作为指向int
的指针,指向数组的第一个元素,例如:
*arr = 123;
然后数组将是:arr = { 123, 666, ... }
此外,您可以将数组传递给一个函数,该函数采用int *:
void f( int* a ) { /* ... */ }
并称之为:
f( arr );
与这样称呼它完全相同:
f( &arr[ 0 ] );
这就是The result is a pointer to the first element of the array.
的含义。
另一种方式,你可以使用第一个元素的地址:
*( &arr[ 0 ] + 1 ) = 222;
这将使数组中的第二个元素具有值222
;它与
arr[1] = 222;
和
*( arr + 1 ) = 222;