标准转换:数组到指针的转换

时间:2010-11-19 09:25:22

标签: c++ arrays

这是ISO 的要点:标准转换:数组到指针转换:$ 4.2.1

  

“数组”类型的左值或右值   N T“或”未知界限的数组   T“可以转换为右值   类型“指向T的指针”结果是   指向第一个元素的指针   数组。

任何人都可以解释这一点,如果可能,请使用示例程序。

我已经看过这些链接,但我无法理解:

Array and Rvalue

I think I may have come up with an example of rvalue of array type

4 个答案:

答案 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;