Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图理解数组的名称是什么意思_C++_Arrays_Pointers_Sizeof - Fatal编程技术网

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
@因为与数组中的整数没有关系,所以它可以是任何类型的数组(好的,除了cv
char
)。
的重载与函数无关。例如,
arr+1
中有一个衰减,而
+
是一个内置运算符,
f(arr)中没有衰减
对于
void f(int(&)[5]);
即使
f
是一个函数。我很困惑。你声明你知道数组不是指针(它不是真的),然后你继续说
arr
是指针。它不是指针,它是数组!
sizeof
不会触发数组到指针的衰减。但当传递给函数时,它会衰减为指针"如果函数参数是一个指针。@Forat-具体地看一看为什么数组和它的第一个元素可以有相同的地址。看一看什么是数组衰减。这确实消除了我的疑问,感谢参数数组是否衰减取决于参数的类型。当参数是对数组的引用时,参数数组将不是腐烂。
Foo size: 4
Foo size: 20