在C ++中取消引用该指针之前,递增由函数返回的指针

时间:2011-03-09 06:13:54

标签: c++ function pointers

我目前难以处理涉及函数的函数问题,该函数遍历2列数组的第一列以查找最小值,然后返回指向具有最小值的元素的指针。那部分不是太糟糕,但我的问题是:

    cout<<"The minimum travel time is "<<*minimumTravelTime(travelTime)<<endl; //Prints minimum travel time

    //FIX THIS PART
    methodDeterminator = (*minimumTravelTime(travelTime))++;
 cout<<"THE CASE IS "<<methodDeterminator<<endl;
    //FIX THIS PART

switch(methodDeterminator)
{
    case 0: transportMethod = "transporter";
              break;
    case 1: transportMethod = "stargate";
              break;
    case 2: transportMethod = "Alcubierre drive";
              break;
    case 3: transportMethod = "hyperdrive";
              break;
    case 4: transportMethod = "TARDIS";
              break;
    default: cout<<"Error.  Could not find transport mode."<<endl;
}

cout<<"Travel by "<<transportMethod<<" will take "<<*minimumTravelTime(travelTime)<<" months."<<endl; //Prints travel method and time

找到最短时间的功能在这里

int *minimumTravelTime(int travelArray[][2])
{
    int *pMinimum; //Pointer for minimum time
    int currentMin, pastMin; //Holding places for finding minimum travel time

    for(int r = 0; r < 5; r++) //5 rows
    {
        for(int c = 0; c < 2; c++) //2 columns
        {
            if(c == 0) //If first column
            {
                if(r == 0) //If first row
                {
                    currentMin = travelArray[r][c]; //First row value stored as currentMin
                }
                else
                {
                    pastMin = currentMin; //Set previously determined currentMin as pastMin
                    currentMin = travelArray[r][c]; //Get current value

                    if(currentMin > pastMin) //If current value is greater than pastMin
                    {
                        currentMin = pastMin; //Set currentMin to be pastMin
                    }
                }
            }
        }
    }

    pMinimum = &currentMin; //Points to memory location of currentMin

    return pMinimum; //Return address of minimum value
}

标有“// FIX THIS PART”的部分是我遇到麻烦的地方。我希望它增加函数在解除引用之前返回的内存地址(所以我可以在数组的第二列中获取值,这将对应于switch语句中的情况)。我无法在函数的实现中删除函数名中的*,也不能删除内括号,否则会给出错误“Expression是一个不可修改的左值。”

感谢您的帮助。我一直在努力解决这个问题几个小时。我也找不到任何具体代码的示例代码(在解除引用之前递增指针,并且函数返回指针)。

4 个答案:

答案 0 :(得分:0)

pMinimum = &currentMin; //Points to memory location of currentMin
return pMinimum; //Return address of minimum value

currentMin是一个局部变量,所以你要返回一个指向局部变量的指针。这是问题所在,因为函数返回后局部变量不存在,但您仍在尝试在调用站点上访问它。这不会产生预期的结果。

更好地更改函数的返回类型,然后按值返回currentMin

int minimumTravelTime(int travelArray[][2]) //changed the return type!
{
    //your code
    return currentMin;
}

并称之为,

 int minTravelTime = minimumTravelTime(travelTime);

编辑:

如果要求您从函数返回指针,则可以执行以下操作:

  return new int(currentMin); //allocate memory, initialize it, and return it!

请注意语法为new int(currentMin),而不是new int[currentMin]。这两种语法有所不同!

在通话网站上:

  int *minTravelTime = minimumTravelTime(travelTime);

  //use minTravelTime

  delete minTravelTime; //delete the memory once you're done!

答案 1 :(得分:0)

您提供的代码似乎存在多个问题。

for(int c = 0; c < 2; c++) //2 columns
        {
            if(c == 0) //If first column

这部分确保你的循环永远不会检查第二列,这是错误的。

递增返回指针值的逻辑将不起作用,因为返回的值不是数组内的指针,而是指向局部变量的指针(Nawaz已经指出的问题)。此外,您已经在函数minimumTravelTime中找到了第二列的最小值,因此无需进一步处理。

如果您仍希望在解除引用之前递增返回的指针,则必须执行预递增。但是,应该首先将返回的值收集到本地指针中,然后预先递增,否则您将收到“左值”错误。

答案 2 :(得分:0)

methodDeterminator = minimumTravelTime(travelTime)[1];

或等效

methodDeterminator = *(minimumTravelTime(travelTime) + 1);

但是,正如Nawaz所解释的那样,你返回指向列的指针。你需要设置

pMinimum = travelArray[r];

您设置currentMin并从minimumTravelTime函数返回该值。比使用[1]甚至应该清楚 - 该函数返回带有一个索引的数组,并添加第二个索引。

但是,这是C ++,你应该首先使用std::map C ++提供了许多高杠杆概念以避免操纵指针,你应该使用它们来保持你的代码可维护并避免愚蠢的错误(如果你使用了适当的结构,你在代码中至少会遇到3个严重的问题。)

答案 3 :(得分:0)

  

我希望它增加内存   函数返回的地址   在解除引用之前。

minimumTravelTime()返回的指针不是l值(就程序而言,它在内存中没有地址),这意味着你不能像你一样修改它的值如果指针被声明为变量。

可以做的是为返回的指针添加一个值并取消引用结果,如下所示:

methodDeterminator = *(minimumTravelTime(travelTime) + 1);

...或者,更好的是,使用数组表示法来完成同样的事情,比如:

methodDeterminator = minimumTravelTime(travelTime)[1];

您也可以这样做:

int *p = minimumTravelTime();

methodDeterminator = *(++p); // increment first, then dereference

...但除非你想在其他地方使用指针,否则没有充分的理由这样做。