0

如何查找传递给函数的字符串数组的大小。大小应该在函数内部计算。

#include<iostream>

using namespace std;


template <typename T,unsigned S>
unsigned arraysize(const T (&v)[S]) { return S; }

void func(string args[])
{
   unsigned m=arraysize(args);
   cout<<m;
}

int main()
{
    string str_arr[]={"hello","foo","bar"};

    func(str_arr);  
}

我不明白的是:

如果在 main 中使用该语句arraysize(str_arr),则不会造成问题。str_arr 是一个数组,所以 str_arr 充当一个指针,所以当我们使用 arraysize(str_arr) 时,这意味着我们正在将地址发送给 arraysize 函数。(如果我错了,请纠正我)。

但是在函数func()中,我不明白为什么会出现问题,即语句arraysize(args)发送字符串数组args的地址(或指针args的地址)..还是因为它变成了一些双指针而变得更复杂?解释?

另外请更正上面的代码..

4

5 回答 5

0

当发送到函数时,无法确定数组的大小。您还必须记住,只有一个指向数组的指针被发送给函数,这使得计算数组的大小在理论上甚至是非常不可信的。

于 2013-03-06T20:09:34.917 回答
0

string args[]数组大小的信息在您的函数中永远不可见,因为您在决定将其用于参数时将其丢弃。从编译器的角度来看,它与string* args. 您可以将功能更改为:

template<size_t M>
void func(string (&args)[M])
{
   cout<<M;
}

但似乎你已经知道了,对吧?

于 2013-03-06T20:11:26.700 回答
0

str_arr是一个字符串数组。当你这样做时sizeof(str_arr),你会得到那个数组的大小。然而,尽管它args看起来像一个字符串数组,但事实并非如此。看起来像数组的参数实际上是指针类型。即由编译器string args[]转换为。string* args当你这样做时,sizeof(args)你只是得到指针的大小。

您可以将数组的大小传递给函数,也可以使用模板参数大小获取对数组的引用(就像您对 所做的那样arraysize):

template <size_t N>
void func(string (&args)[N])
{
   // ...
}
于 2013-03-06T20:11:48.790 回答
0

如果在 main 中使用该语句arraysize(str_arr),则不会造成问题。是str_arr一个数组,所以str_arr充当一个指针,所以当我们使用它时arraysize(str_arr),我们将地址发送给 arraysize函数。(如果我错了,请纠正我)。

我必须在这里纠正你。你陈述了一个正确的前提,却得出了错误的结论。

关键点确实str_arrmain. 虽然数组在许多(大多数)表达式上下文中衰减为指针,但当对数组的引用被初始化时,这并不适用。这就是为什么array_size声明要引用数组参数的原因 - 这是拥有数组类型参数的唯一方法,这意味着它具有定义的长度。

情况并非如此func。当函数参数被声明为普通数组类型时,指向指针衰减的数组将应用于该声明。您的声明func等同于void func(string * args). 因此args是指针,而不是数组。你可以func称之为

string str_non_array;
func(&str_non_array);

因此,对数组的引用不能绑定到它。无论如何,args已经完全丢失了有关它指向的数组大小的所有信息。

您可以使用与以下相同的引用数组技巧arraysize:声明func

template <std::size_t N>
void func(string (&args)[N]);

但这在任何地方都是不切实际的(如果天真地应用于所有数组处理代码,可能会导致代码膨胀)。其他语言中可用的具有长度的数组的 C++ 等效项是std::vector<string>(对于动态大小的数组)或std::array<string,N>(对于在编译时已知的固定大小)。请注意,后者可能会导致与上述相同的代码膨胀,因此在大多数情况下,std::vector<string>它将是您需要传递给各种函数的数组的首选类型。

于 2013-03-06T20:25:46.517 回答
0

德米特里是对的,我想进一步解释一下。它发生的原因是因为数组不是 C++ 中的一等公民,当作为参数传递时,它会衰减为指针,而您在调用函数中得到的是指向其第一个元素的指针,并且大小丢失。您可以将C++ 数组作为函数参数引用,以查看可用的替代选项。

于 2013-10-15T09:02:10.937 回答