-2

为什么在 C++中对于包含其他类型数据的数组的sizeof(array) 行为方式不同?bool array

版: 我问是因为

sizeof(boolarray)/sizeof(boolarray[0])

不要给出布尔数组的大小。

但这个简单的代码打印:

4
1

/////////////////////////

#include<iostream>
using namespace std;
void printBoolArray(bool* boolarray){
    cout<<sizeof(boolarray)<<"\n";
    cout<<sizeof(boolarray[0]);  
}


int main(){
    bool boolarray[10]={false};
    printBoolArray(boolarray);
}

知道我理解函数中的 sizeof 给出了引用的对象的大小,这是我使用 C++ 的 9 天,抱歉这个愚蠢的问题,现在很明显

4

3 回答 3

4

它的作用没有什么不同。是什么让你认为它确实有效?您是否对 a 的大小做出了错误的假设bool


正如评论中提到的那样,如果您将数组传递给函数并尝试在那里计算它的大小,那是行不通的。您不能将数组传递给(或从)函数返回。例如:

void foo(int array[10])
{
    auto size = sizeof(array);
    // size == sizeof(int*), you didn't pass an array
}
于 2013-02-28T23:30:01.430 回答
2
#include <cstddef>
#include <iostream>

template<std::size_t n>
void printBoolArray(bool (&boolarray)[n]){
  std::cout<<sizeof(boolarray)<<"\n";
  std::cout<<sizeof(boolarray[0]);  
}

int main(){
  bool boolarray[10]={false};
  printBoolArray(boolarray);
}

以上工作。

sizeof(bool*)是指针的大小,而不是它指向的数组。

上面,我仔细维护了boolarray. 碰巧,这种技术还将大小提取到编译时常量n中。

这不能很好地扩展,因为当您将数组传递给函数时,它们会迅速衰减为指针。这是为什么std::arraystd::vector可以建议的原因之一——它们的怪癖比 C 样式数组少。

于 2013-02-28T23:45:09.950 回答
1

正如其他人所解释的,数组在传递给函数时会退化为指针。

但是,有一种解决方法;你可以使用模板。

template<typename T, size_t N>
size_t length(T (&)[N]) {
    return N;
}
于 2013-02-28T23:43:08.293 回答