如何在不将此数组作为参数的函数内修改数组

时间:2014-08-22 20:30:37

标签: c++ reference dynamic-arrays

我需要修改 modifyAA(int a)功能中的 pTab 数组。 我怎样才能做到这一点?

示例代码:

int modifyAA(int a); 

int main()
{
  *pTab=new int[10]; int a=13;

  for(int i=0;i<=9;i++)
      pTab[i]=88;                      

  modifyAA(a);      
  //I'd like to have pTab to be modified after function invoke
return 0;
}

modifyAA(int a){

  for(int i=0;i<=9;i++)
     pTab[i]=pTab[i]+1; 

a=a+pTab[0];  
return a;                  
};       

当函数不将其作为参数时,是否可以修改数组?

3 个答案:

答案 0 :(得分:3)

您可以将全局变量用于指向动态数组的第一个元素的指针:

int * pTab;

int printAA(int a)
{
    for (unsigned int i = 0 i != 10; ++i)
    {
        ++pTab[i];
    }
    return a + pTab[0];
}

int main()
{
    pTab = new int[10];

    // populate

    printAA(13);
}

答案 1 :(得分:1)

如果您要执行此操作“C ++方式”,您可以使用stdlib中的vector和迭代器,如下所示:

#include <vector>

typedef std::vector<int> PTab;   // Defines a type for your pTab, it's a vector of integers

int printAA(PTab::iterator from, PTab::iterator until, int a);    //declaring some func

int main()
{
    PTab pTab(10, 88);      // Initializes pTab vector to 10 elements all containing 88

    int a = 0;
    printAA(pTab.begin(), pTab.begin() + 10, a);

    return 0;
}

int printAA(PTab::iterator from, PTab::iterator until, int a)
{
    for (PTab::iterator i = from; i != until; ++i)
    {
        *i++;      // Increments current element by 1
    }

    a += *from;  // Adds the value of the from element to a
    return a;
};

这样你就不会将向量本身传递给函数,相反,你只传递一系列迭代器,这使得函数可以访问向量的内容,但不能修改向量对象本身(即清除,调整大小等。)。

答案 2 :(得分:1)

您可以使用全局变量。如果像printAA()这样的函数需要调用它,这可能是实用的。

但是,在分配之前使用* pTab存在风险。而且,你现在还记得大小,但如果以后你将大小改为10,那么你必须找回所有你硬编码10或9的地方。

如果不传递参数的目的主要是因为你多次调用函数,你可以选择std::bind,创建一种动态函数:

#include <iostream>
#include <functional>

int printDynArr(int* dynarr, size_t sz, int a)  // proper function with all parameters 
{
    for (size_t i = 0; i < sz; i++)
        dynarr[i]++;            // It's a pointer, so you modify the data where it is stored 
    a += dynarr[0];
    return a;
};

int main()
{
    int *pTab = new int[10]; int a = 13;    //declaring and alocating - dynamic array
    auto printAA = std::bind<int>(printDynArr, pTab, 10, std::placeholders::_1);   // dynamic function shortcut with predefind parameters

    ...    
    printAA(a);           //using function without giving pTab as argument.                  

    std::cin.get(); 
    return 0;
}