C++;阵列识别? 当你在C++中传递一个数组时,它们会作为指针传递。所以我们必须显式地传递数组的大小 // This will not work. int GetSize(int* arr){ return sizeof(arr)/size(int); }

C++;阵列识别? 当你在C++中传递一个数组时,它们会作为指针传递。所以我们必须显式地传递数组的大小 // This will not work. int GetSize(int* arr){ return sizeof(arr)/size(int); },c++,arrays,sizeof,C++,Arrays,Sizeof,但是如果我们不使用函数来获取其大小,并且在初始化数组的同一个函数中使用“sizeof”,那么现在我们就得到了正确的结果 int main(){ int arr[5]; int size = sizeof(arr)/sizeof(int); cout << size << endl; } intmain(){ int-arr[5]; int size=sizeof(arr)/sizeof(int); 不能声明 int *arr; // arr = ptr to

但是如果我们不使用函数来获取其大小,并且在初始化数组的同一个函数中使用“sizeof”,那么现在我们就得到了正确的结果

int main(){
  int arr[5];
  int size = sizeof(arr)/sizeof(int);
  cout << size << endl;
}
intmain(){
int-arr[5];
int size=sizeof(arr)/sizeof(int);
不能声明

int *arr; // arr = ptr to int
int arr[5];  // arr = base ptr to array of 5 ints
与声明不同

int *arr; // arr = ptr to int
int arr[5];  // arr = base ptr to array of 5 ints
注意,
arr
在每种情况下都解析为一个地址(ptr),但在第二种情况下,编译器可以将
arr
作为一个基本ptr解析为一个5
int
的数组。如果第二个声明是针对函数参数,事情会变得有点棘手:

void foo(int arr[5]) { ... }
那么这真的和

void foo(int *arr) { ... }
void foo(int arr[]) { ... }
i、 例如,只传递ptr,并且
sizeof(arr)
将返回ptr中的字节数。

声明

int *arr; // arr = ptr to int
int arr[5];  // arr = base ptr to array of 5 ints
与声明不同

int *arr; // arr = ptr to int
int arr[5];  // arr = base ptr to array of 5 ints
注意,
arr
在每种情况下都解析为一个地址(ptr),但在第二种情况下,编译器可以将
arr
作为一个基本ptr解析为一个5
int
的数组。如果第二个声明是针对函数参数,事情会变得有点棘手:

void foo(int arr[5]) { ... }
那么这真的和

void foo(int *arr) { ... }
void foo(int arr[]) { ... }

i、 例如,只传递一个ptr,并且
sizeof(arr)
将返回ptr中的字节数。

在第一种情况下,正如我正确理解的那样,您使用的是int*类型的大小,它是指向int的指针,在大多数情况下,它将产生4个字节(取决于架构和可能的其他因素)


在第二种情况下,编译器还拥有计算sizeof(arr)所需的所有信息,因为根据int-arr[5]的定义,有5个int元素被显式给定;因此,在大多数情况下,将等于4字节*5个元素,20字节

在第一种情况下,正如我正确理解的那样,您使用的是int*类型的大小,它是指向int的指针,在大多数情况下,它将产生4字节(取决于体系结构和可能的其他因素)

在第二种情况下,编译器还具有计算sizeof(arr)所需的所有信息,因为根据int-arr[5]的定义,有5个int元素被显式给定;因此,在大多数情况下,将等于4个字节*5个元素,20个字节


那么,将数组视为一个带有指针的类、数组的大小和元素的类型是否足够

不,因为它不是。C样式数组只是一块连续内存,其中包含给定类型的元素,不多也不少

现在我想,如果C++和指针的处理相同,我不知道C++在后面的代码中是如何知道数组的大小的。 这不是处理数组的方式

在第一个示例中,函数只接受一个指针,它不关心该指针来自何处。传入数组会将数组衰减为指向第一个元素的指针。所有大小信息都会丢失,并且数组的大小不能仅从指针确定。这就是为什么
sizeof(arr)
在该上下文中不起作用。它只知道指针本身的大小,而不知道指针来自的数组的大小

在第二个示例中,实际数组在使用
sizeof()
的范围内。编译器知道数组的声明,因此
sizeof(arr)
可以知道数组的实际字节大小

如果您确实想知道函数中传递的数组的大小,并且不想将该大小显式作为参数传递,请通过引用而不是指针来传递数组,这样数组的大小就不会丢失:

模板
int GetSize(int(&arr)[N]){
返回N;
}

那么,将数组视为一个带有指针的类、数组的大小和元素的类型是否足够

不,因为它不是。C样式数组只是一块连续内存,其中包含给定类型的元素,不多也不少

现在我想,如果C++和指针的处理相同,我不知道C++在后面的代码中是如何知道数组的大小的。 这不是处理数组的方式

在第一个示例中,函数只接受一个指针,它不关心该指针来自何处。传入数组会将数组衰减为指向第一个元素的指针。所有大小信息都会丢失,并且数组的大小不能仅从指针确定。这就是为什么
sizeof(arr)
在该上下文中不起作用。它只知道指针本身的大小,而不知道指针来自的数组的大小

在第二个示例中,实际数组在使用
sizeof()
的范围内。编译器知道数组的声明,因此
sizeof(arr)
可以知道数组的实际字节大小

如果您确实想知道函数中传递的数组的大小,并且不想将该大小显式作为参数传递,请通过引用而不是指针来传递数组,这样数组的大小就不会丢失:

模板
int GetSize(int(&arr)[N]){
返回N;
}
  • 为什么
    sizeof()
  • 当数组作为指针传递时,为什么它不起作用?-这是因为数组在此处衰减为指针。因此,它会丢失大小信息。事实上,
    sizeof(arr)
    此处将给出系统上指针的大小-64位机器为8字节,32位机器为4字节
  • 为什么
    sizeof()
  • 为什么数组作为指针传递时它不起作用?-因为