数组作为参数

时间:2010-11-26 08:49:39

标签: c++ arrays argument-passing

我创建了一个数组:

CString* pstrArray = new CString[nMySize];

现在我该如何将它传递给要填充的函数?实际参数是什么?

void FillThisArray(what goes here?)
{
}

6 个答案:

答案 0 :(得分:4)

您应该使用容器类:CStringArray

void FillThisArray( CStringArray & rMyStrings )

如果你不想要这个(我没有看到任何可能的原因,但无论如何):

void FillThisArray(CString* strings, size_t num)
{
  // example
  for( size_t s=0; s<num; s++ )
  {
    strings[s].Format( _T("This is the %d. string"), s+1 );
  }
}

答案 1 :(得分:4)

  

CString * pstrArray = NULL; pstrArray = new CString [nMySize];

为简单起见:

CString* pstrArray = new CString[nMySize];
  

现在我怎样才能将它传递给一个要填充的功能?什么是实际参数?
  void FillThisArray(????){}

最明显的界面是:

void FillThisArray(CString* pstrArray, size_t n)

退后一步:

  • 请注意,nMySize默认构造的CString的所有内存都将由该单个新语句分配
  • 你应该考虑使用std::vector<std::string>
    • std::vector因为:
      • 在超出范围时自动删除所有字符串的内存
      • 默认情况下,在使用例如字符串添加字符串时,内存使用量将逐渐增加。 push_back(),在此类使用情况下,如果您没有任何特殊工作,可能会超出初始规模
      • 如果您真的想要这种行为,那么在构建vector时,您可以主动为nMySize字符串保留空间和/或创建它们
    • std::string因为:
      • 它是由C ++标准定义的可移植字符串类型,并减少对依赖项的锁定
      • 说,在某些情况下避免可能是不切实际或低效的

答案 2 :(得分:3)

如果有一个很好的理由不能使用标准容器类,请考虑采用迭代器式方法。这样可以避免担心函数中的数组有多大:

void FillThisArray(CString* begin, CString* end)
{
    for (CString* iter = begin; iter != end; ++iter)
    {
        *iter = "Some text";
    }
}

int main()
{
    CString* pstrArray = new CString[nMySize];
    FillThisArray(&pstrArray[0], &pstrArray[nMySize]);

    for (int i = 0; i < nMySize; ++i)
    {
        assert(pstrArray[i] == "Some_text");
    }

    delete[] pstrArray;
}

你甚至可以模拟你的函数,使它不依赖于pstrArray的(可疑的)实现:

template <typename T>
void FillThisArray(T begin, T end)
{
    for (T iter = begin; iter != end; ++iter)
    {
        *iter = "Some text";
    }
}

int main()
{
    {
        CString* pstrArray = new CString[nMySize];
        FillThisArray(&pstrArray[0], &pstrArray[nMySize]);

        for (int i = 0; i < nMySize; ++i)
        {
            assert(pstrArray[i] == "Some text");
        }

        delete[] pstrArray;
    }
    {
        std::vector<std::string> better(nMySize);
        FillThisArray(better.begin(), better.end());
        for (int i = 0; i < nMySize; ++i)
        {
            assert(better[i] == "Some text");
        }
    }
}

答案 3 :(得分:1)

您需要将指针传递给第一个元素以及可用元素的数量:

void FillThisArray(CString* strings, size_t num)
{
}

答案 4 :(得分:0)

您必须将dymanically allocate数组作为指向其第一个元素的指针传递。有两种语法,两者都是等价的:

void FillThisArray(CString* strArray)
{
}

void FillThisArray(CString  strArray[])
{
}

您可以将strArray参数用作函数内的数组。请注意,指针不包含有关数组实际大小的信息,因此如果大小不是全局可用的,则应将大小作为第二个参数传递。 hth

答案 5 :(得分:-1)

void FillThisArray(CString* pstrArray)

你不能这样做吗?