作为函数参数传递的数组的大小

sizeof an array passed as function argument

本文关键字:数组 参数传递 函数      更新时间:2023-10-16

可能重复:
函数自变量中数组的长度

嗨,我正在做作业,我完全被难住了。我们假设列表的每个顺序都是一个整数数组,所以我根据老师的伪代码写了这段代码:

void permute(int v[], int curr,char letters[])
{
    if(curr >= sizeof(v)/sizeof(int))
    {
        checkit(v,letters);
    }
    for(int i = curr; i < sizeof(v)/sizeof(int); i++)
    {
        swap(i,curr,v);
        permute(v,curr + 1,letters);
        swap(v[curr],v[i]);
    }//for
}//permu

我唯一不确定的是sizeof(v)/sizeof(int)是否是正确的选择。

sizeof(v)/sizeof(int)不是一条路。您的功能完全等效于:

void permute(int *v, int curr, char *letters)
{
    ...
}

v实际上不是一个数组,而是一个指针。不能在C或C++中传递数组。

解决方案如下(并非详尽无遗(:

  • 添加一个显式描述数组长度的额外参数
  • 添加一个指向数组最后一个元素的额外参数
  • 使用适当的容器(例如std::vector(,可以在上调用size()
  • @sehe建议的模板解决方案

我最讨厌的一件事是:你可以用C++为你的推导数组大小

template <size_t N>
void permute(int (&v)[N], int curr,char letters[])
{
    if(curr >= N)
    {
        checkit(v,letters);
    }
    for(int i = curr; i < N; i++)
    {
        swap(i,curr,v);
        permute(v,curr + 1,letters);
        swap(v[curr],v[i]);
    }//for
}//permu

除了Oli的答案外:C++中的典型方法是将一个指针传递到要排列的序列的开头和结尾。按照惯例,起始指针是包含的,结束指针是排他的。

void permute(int *v, int *begin, int *end, char *letters) {
  if (begin == end) {
    checkit(v, end, letters);
  } else {
    ...
    permute(v, begin + 1, end, letters);
    ...
  }
}