如何在for循环条件下正确使用`sizeof`运算符?

时间:2019-05-14 09:53:40

标签: c++ arrays function for-loop sizeof

for循环的条件是否总是需要常数? 如何在其中放置sizeof函数以运行显示数组所有元素的输出?

#include<iostream>
using namespace std;

void array_output(int a[])
{
    for (int i = 0; i < (sizeof(a)) / (sizeof(a[0])); i++)
    {
        cout << a[i] << endl;
    }
}

int main()
{
    int a[] = { 22, 53, 13, 65, 80, 31, 46 };
    array_output(a);
    return 0;
}
  • i<(sizeof(a) 输出显示第一个 4元素
  • i<(sizeof(a))/(sizeof(a[0])) 输出仅显示第一个元素
  • 当直接使用 sizeof 作为条件时,而不是7,它给出了
    正确的输出,显示所有元素

3 个答案:

答案 0 :(得分:4)

此答案适用于个用户...

根本不需要使用sizeof运算符的地方。 改用 std::size() 函数,该函数将为您提供给定容器或数组的大小。

#include <iostream>
#include <iterator>  // std::size
#include <cstddef>   // std::size_t

int main()
{
    int a[]{ 22,53,13,65,80,31,46 };
    for (std::size_t i = 0; i < std::size(a); i++)
    {
        std::cout << a[i] << `\n`;
    }
}

更新

OP在发布此答案后编辑了问题, std::size无法应用的地方。

当数组a传递给void array_output(int a[])时,它被推导为void array_output(int* a) 而不是其实际类型为int a[7]

  • i<(sizeof(a)输出显示前4个元素

    在这里,您正在做size of(int*) int的指针),具体取决于 on the architecture 它可能是传出的。在您的情况下,这是32位计算机,这就是您获得sizeof(a) = 4的原因。

  • i < sizeof(a)/ sizeof(a[0])输出仅显示第一个元素

    将等于sizeof(a)个字节的sizeof(int*4)相除 sizeof(a[0])也就是sizeof(int),也就是4个字节)中的机器),只能是一个,并且只循环一次。

@Timo 的 答案,提供一个模板化函数,其中size将是非类型的模板参数,可以直接访问而无需使用sizeof


  

如何将sizeof放到函数中并运行显示所有   数组的元素?

仅当实际传递实际类型的数组a时,这是可能的。 为此,通过完美转发让数组推导为其int [7]

#include<iostream>

template<typename Type>
void array_output(Type&& a) // deduced to `int a[7]`
{
    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { // or std::size(a)
        std::cout << a[i] << '\n';
    }
}

int main()
{
    int a[] = { 22, 53, 13, 65, 80, 31, 46 };
    array_output(a);
    return 0;
}

答案 1 :(得分:1)

您可以为此使用矢量。

vector<int> nums{1,2,3,4};
for(std::size_t i = 0; i < nums.size(); ++i)
  cout<<nums[i]<<endl;

如果您坚持使用int a [],则在遍历它之前应该知道它的大小。 顺便说一句,在海湾合作委员会上

sizeof(nums) = sizeof(int) * total number of element

不是元素总数。

答案 2 :(得分:1)

如果您在sizeof运算符中使用实际数组,则将获得该数组的大小(以字节为单位),这意味着您可以使用sizeof(array) / sizeof(array_type)计算出所需元素的数量。

int x[] = {1, 1, 1, 1, 1, 1};    
int sum = 0;

for (int i = 0; i < sizeof(x) / sizeof(int); i++)
    sum += x[i];

// sum == 6

但是,如果将数组作为函数参数传递,则会遇到指针衰减。这意味着数组大小信息将会丢失,而您将获得指针大小,这就是您描述的行为。

int sum(int arr[])  // arr decays to int*
{
    int sum = 0;

    for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
        sum += arr[i];

    return sum;
}

int main() 
{   
    int x[] = {1, 1, 1, 1, 1, 1};    
    return sum(x);  // will return 1 or 2, depending on architecture
}

如果使用模板函数,仍可以在函数中获取数组大小。

#include <cstddef>

template <std::size_t N>
int sum(int (&arr)[N])
{
    int sum = 0;

    for (int i = 0; i < N; i++)
        sum += arr[i];

    return sum;
}

int main() 
{   
    int x[] = {1, 1, 1, 1, 1, 1};    
    return sum(x);  // will return 6
}