C++ 试图理解数组的名称是什么意思
我写了这个简单的程序C++ 试图理解数组的名称是什么意思,c++,arrays,pointers,sizeof,C++,Arrays,Pointers,Sizeof,我写了这个简单的程序 #include <iostream> using namespace std; int main (){ int arr [5] = {1,2,3,4,5}; cout<<arr<<endl; //Line 1 cout<<&arr<<endl; //Line 2 cout<<sizeof(arr)<<endl; //Line
#include <iostream>
using namespace std;
int main (){
int arr [5] = {1,2,3,4,5};
cout<<arr<<endl; //Line 1
cout<<&arr<<endl; //Line 2
cout<<sizeof(arr)<<endl; //Line 3
cout<<sizeof(&arr)<<endl; //Line 4
}
#包括
使用名称空间std;
int main(){
int-arr[5]={1,2,3,4,5};
库特
我知道数组不是指针,但当传递给函数时,它会衰减为指针,sizeof(..)是运算符,因此它将arr视为数组
没错,所以第2行有20个字节
但是要理解第2行,您确实需要理解数组和指针之间的区别。首先,在声明数组时,您要声明数组所包含的类型(int),然后保留组成数组的多个(int)大小的字节。毫无疑问,数组是整个数组结构
int arr[5] = {1, 2, 3, 4, 5};
如果您想计算当前计算机上int的大小(以字节为单位),您可以像在第4行中一样请求数组中单个元素的大小
sizeof &arr
// this is equivalent to ...
sizeof &arr[0]
// you could also ask for just ...
sizeof arr[0]
这些都将返回4个字节(计算机上int的大小)
请理解arr本身没有地址。请考虑一下,当您将数组传递给函数时,您只传递第一个元素的地址。因此,这两个函数声明完全相同:
int foo(char *arr);
int foo(char arr[]);
因此,当在第3行中询问数组的大小时,就是询问整个数组的大小。(5*4字节)=20字节
要理解的另一个极其重要的问题是,当您将数组传递给函数时,您只传递数组中第一个元素的地址。因此,如果您创建了一个函数:
int array_size(char arr[]) { return sizeof arr; }
int main() {
int foo[5] = { 1, 2, 3, 4, 5 };
std::cout << "Foo size: " << array_size(foo) << std::endl;
std::cout << "Foo size: " << sizeof foo << std::endl;
return 0;
}
因此,@Forat@因为与数组中的整数没有关系,所以它可以是任何类型的数组(好的,除了cvchar
)。的重载与函数无关。例如,arr+1
中有一个衰减,而+
是一个内置运算符,f(arr)中没有衰减
对于void f(int(&)[5]);
即使f
是一个函数。我很困惑。你声明你知道数组不是指针(它不是真的),然后你继续说arr
是指针。它不是指针,它是数组!sizeof
不会触发数组到指针的衰减。但当传递给函数时,它会衰减为指针"如果函数参数是一个指针。@Forat-具体地看一看为什么数组和它的第一个元素可以有相同的地址。看一看什么是数组衰减。这确实消除了我的疑问,感谢参数数组是否衰减取决于参数的类型。当参数是对数组的引用时,参数数组将不是腐烂。
Foo size: 4
Foo size: 20