我试图弄清楚C ++中数组和指针之间的关系是如何工作的。我已经阅读了很多主题,我觉得它似乎并没有坚持下去。在这里查看这一小段代码:
int studentAge[5];
int *p = &studentAge[0];
我已经读过引用运算符(&)为array->指针衰减规则创建了一个例外。所以,从我所读过的内容来看,我相信他们说&studentAge
在技术上是指向5个整数值的指针,而不是指向单个整数的指针。要详细说明,是不是说它的类型为int(*)[5]
,无法转换为int*
?
如果它是一个指向5个整数值的指针,那么这是不是意味着它实际上已经衰减为指针?或者我认为这完全错了吗?
此外,使用以下代码行:
p = studentAge;
如果没有引用运算符,studentAge数组现在会衰减为指针吗?如果我到处都是这样,我道歉,但正如我之前所说,我很难在这方面100%明白。
答案 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