【问题标题】:sizeof an array passed as function argument [duplicate]作为函数参数传递的数组的大小[重复]
【发布时间】:2012-01-05 06:07:16
【问题描述】:

可能重复:
length of array in function argument

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

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),我建议您编辑您的问题标题,因为它与“排列递归”无关...

标签: c++ recursion


【解决方案1】:

sizeof(v)/sizeof(int) 不是要走的路。您的函数完全等同于:

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

v 不是真正的数组,它是一个指针。您不能在 C 或 C++ 中传递数组。

解决方案是以下之一(并非详尽无遗):

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

【讨论】:

  • 容器+1,即使对于家庭作业,他们有时不会让你以“正确”的方式去做。
  • 我认为你可以 - permute(int n[5]) 可以吗?数组并没有完全按值传递。但它是一个数组
  • @Adrian:当数组用作函数参数时,它会衰减为指针。
  • @Oli 你能指出我在标准中的那段话(C99、C++98、C++03、C11 无关紧要)。例如,它会是 C98 中的 C++ 中的 8.3.4.8 吗? [示例:考虑 int x[3][5];这里 x 是一个 3´5 的整数数组。当 x 出现在表达式中时,它被转换为指向(三个中的第一个)五元整数数组的指针。在表达式 x[i] 中,它等价于 *(x+i),首先将 x 转换为所描述的指针;然后将x+i转换为x的类型,这涉及到将i乘以指针指向的对象的长度,即5...
  • @Adrian: C99, 6.3.2.1, 第3段:“除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,表达式类型为''array of type''的类型被转换为类型为''pointer to type''的表达式。
【解决方案2】:

我最讨厌的一个问题:你可以让 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

【讨论】:

  • 非常感谢您的回答!
【解决方案3】:

除了 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);
    ...
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 2015-04-24
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2016-11-04
    相关资源
    最近更新 更多