C ++:数组指针衰减问题

时间:2014-08-17 18:17:36

标签: c++ arrays pointers

我试图弄清楚C ++中数组和指针之间的关系是如何工作的。我已经阅读了很多主题,我觉得它似乎并没有坚持下去。在这里查看这一小段代码:

int studentAge[5];
int *p = &studentAge[0];

我已经读过引用运算符(&)为array->指针衰减规则创建了一个例外。所以,从我所读过的内容来看,我相信他们说&studentAge在技术上是指向5个整数值的指针,而不是指向单个整数的指针。要详细说明,是不是说它的类型为int(*)[5],无法转换为int*

如果它是一个指向5个整数值的指针,那么这是不是意味着它实际上已经衰减为指针?或者我认为这完全错了吗?

此外,使用以下代码行:

p = studentAge;

如果没有引用运算符,studentAge数组现在会衰减为指针吗?如果我到处都是这样,我道歉,但正如我之前所说,我很难在这方面100%明白。

3 个答案:

答案 0 :(得分:3)

如果对函数采用数组参数,它确实会衰减为指针。如果你引用一个数组,它就不会。

#include <iostream>

void take_array(int arr[]) { // same as (int *arr)
    // prints sizeof int*
    std::cout << "take_array: " << sizeof arr << '\n';
    ++arr; // this works, you can increment a pointer
}


void take_array_ref(int (&arr)[10]) { // a reference to an array of int[10]
    // prints (sizeof int) * 10
    std::cout << "take_array_ref: " << sizeof arr << '\n';
    //++arr; // this fails to compile. you can't increment an array
}

int main() {
    int arr[10]; // sizeof arr == (sizeof int) * 10
    take_array(arr); // decays
    take_array_ref(arr); // doesn't decay

    int arr2[2];
    take_array(arr2);  // compiles because it decays
    //take_array_ref(arr2); // doesn't compile, type mismatch 
}

请注意,第一个签名也可以是void take_array(int arr[1000]);或任何其他值,它仍然与指针相同;输出仍然相同,arr参数仍然有效int *

答案 1 :(得分:2)

首先,&studentAge[0]表示&(studentAge[0])

studentAge[0]的上下文中,数组确实衰减到指向第一个元素的指针,即类型int *。然后,[0]立即取消引用,留下int类型。然后,您最终获取该地址(使用地址 - 运算符&),让您返回int *

简而言之,p = &studentAge[0]p = studentAge相同。

答案 2 :(得分:-2)

需要注意的一件重要事情是,当我们定义一个数组时,编译器会分配一个连续的内存块。 另一个需要注意的重要事项是,数组在C / C ++中被视为指针(引用) 所以当我们创建任何数组时说:

int studentAge[5] = {1,2,3,4,5};

它将此数组分配为连续内存块。

&#34; studentAge&#34;基本上是指向数组开头的(int *)

因此,以下两个陈述基本上是做同样的事情

int *p = & (studentAge[0]);
int *p = studentAge;

现在要检查它们是否连续,我们可以执行以下操作:

std::cout << *p << std::endl; // prints 1
std::cout << *(p+1) << std::endl; // prints 2
std::cout << *(p+2) << std::endl; // prints 3
std::cout << *(p+3) << std::endl; // prints 4
std::cout << *(p+4) << std::endl; // prints 5