繁体   English   中英

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

[英]Incrementing a Pointer Returned by a Function before Dereferencing that Pointer in C++

我目前对一个家庭作业问题感到困惑,该问题涉及一个函数,该函数遍历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语句中的情况相对应)。 我无法在函数的实现中删除函数名称中的*,也不能删除内部括号,否则将出现错误“表达式是不可修改的左值”。

感谢您的任何帮助。 我一直在努力解决这个问题达数小时之久。 我也找不到任何特定于我想要做什么的示例代码(在取消引用之前增加指针,并且该指针由函数返回)。

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!

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

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

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

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

如果仍想在取消引用之前增加返回的指针,则必须进行预递增。 但是,应先将返回的值收集到本地指针中,然后再进行预递增,否则将出现“ lvalue”错误。

methodDeterminator = minimumTravelTime(travelTime)[1];

或同等

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

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

pMinimum = travelArray[r];

在这里设置currentMin ,然后从minimumTravelTime函数返回该值。 [1]的使用甚至应该更清楚-函数返回具有一个索引的数组,然后添加第二个索引。

但是,这是C ++,首先应该使用std::map C ++提供了许多高级概念来避免操纵指针,应使用它们来保持代码的可维护性和避免愚蠢的错误(如果使用适当的构造,编译器将至少遇到3个严重的问题,编译器会发现这些问题)。

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

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

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

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

...或者更好的是,使用数组符号来完成相同的事情,如下所示:

methodDeterminator = minimumTravelTime(travelTime)[1];

您还可以执行以下操作:

int *p = minimumTravelTime();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM