[英]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 = ¤tMin; //Points to memory location of currentMin
return pMinimum; //Return address of minimum value
}
我遇到麻烦的地方是标为“ // FIX THIS PART”的部分。 我希望它在取消引用之前增加函数返回的内存地址(这样我就可以在数组的第二列中获取值,这将与switch语句中的情况相对应)。 我无法在函数的实现中删除函数名称中的*,也不能删除内部括号,否则将出现错误“表达式是不可修改的左值”。
感谢您的任何帮助。 我一直在努力解决这个问题达数小时之久。 我也找不到任何特定于我想要做什么的示例代码(在取消引用之前增加指针,并且该指针由函数返回)。
pMinimum = ¤tMin; //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.