c++指针语法错误
c++ pointer syntax error
我正在学习c++考试,我对过去的试卷有一个问题
在C++中写一个函数,它以一个双精度数组和数组的长度作为输入,并返回一个长度为其两倍的数组。返回数组的前半部分应包含原始数组内容的副本。返回的数组的后半部分应按相反顺序包含原始数组的内容。
该函数应具有以下原型:double*copy_and_reverse(double*a,int length)
由于我显然是c++新手,我陷入了解决方案的困境,到目前为止我的代码是:
double *copy_and_reverse(double *a, int length){
double *b[length*2];
for(int i=0;i<length;i++){
*b[i]=a[i];
}
for(int i=length;i<length*2;i++){
int w=length-1;
*b[i]=a[w];
w--;
}
return *b;
}
int main()
{
double nums[2]={1.23,5.364};
double *pnums=nums;
*pnums=*copy_and_reverse(pnums, 2);
我认为我的方法核心是正确的,但我只是停留在使用指针的语法上,任何帮助都是值得感激的,如果可能的话,还有背后的推理,这样我就可以为考试学习了。
您在使用此代码时遇到了一些问题。
第一个
double *b[length*2];
在这里,您要声明一个指向doubles的指针数组。该数组的大小长度为*2,但是,该数组中的指针都无效。这可能不是你想要做的。
您想要一个双人数组,大小为*2。您不能在C++中返回一个数组,但您可以返回一个指向某个内存的指针,该内存包含一个双精度数组。
让我们从为所有这些双分配足够的内存开始
double *b= new double[length * 2];
在您的第一个for循环中,您可以将结果视为数组
for(int i=0;i<length;i++){
b[i]=a[i];
}
在这里,为每个索引i复制来自a的值,使其位于同一索引。我将让您了解如何填充数组后半部分的反向部分。你走在了正确的轨道上,但你可能想考虑在一个循环中完成这一切;)
您的return语句只需要返回变量b,因为它已经是一个双*。
return b;
需要记住的一件重要的事情是,您正在用new分配这个函数中的内存。你有责任在完成后删除它。此外,当你使用new和[]进行分配时,你也必须使用[]进行删除。
delete [] b;
只需取消引用数组中的第一个项,就可以调用函数。
int main() {
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(&pnums[0], 2);//don't forget to clean up pnums afterwards!
您的代码中有很多错误。主要的一个问题是,您需要分配新的双打数组。并返回该数组。我建议将其与您的版本逐行比较:
double *copy_and_reverse(double *a, int length){
double *result = new double[length*2];
for(int i=0;i<length;i++) {
result[i]=a[i];
}
int r = length*2;
for(int i=0; i < length;i++){
result[--r]=a[i];
}
return result;
}
你的main()应该看起来像:
int main()
{
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(nums, 2);
...
delete[] pnums;
}
好的,这个至少有两个问题:
double *b[length*2];
第一个问题是,您正在声明一个本地数组(指针),然后您将尝试返回该数组:
return *b;
(你在这里也返回了错误的东西,但那是另一回事)你不能返回指向本地分配的东西的指针,因为一旦函数返回,本地分配的事情就会被破坏。相反,假设必须返回一个指向数组第一个元素的指针,则必须使用new
动态分配该元素。
其次,不能使用仅在运行时已知的length
来声明这样的数组。但是,当您使用new
来动态分配数组时,这个问题就会得到解决。
我通常会说,你根本不应该做任何,只需要使用std::vector
——但很明显,这个赋值的一个要求是使用动态分配的C样式数组。(我对你的教授有很大的意见。)
我还想说,原型:
double *copy_and_reverse(double *a, int length);
并没有像教授错误地断言的那样,声明一个采用数组的函数,而是声明一个使用指向double
的指针的函数。该指针是数组中的第一个元素并不能神奇地使a
成为数组。简而言之:数组和指针不是一回事。
最后两个观察只是为了你的利益。
我想这不是你的家庭作业,我想帮你。看看代码的注释。
double *copy_and_reverse(double *a, int length)
{
double * b = new double[length*2]; //create a new array using new[]
for(int i=0;i<length;i++){
b[i]=a[i]; //addressing element with []
}
int w=length-1; //I assume this is what you want
for(int i=length;i<length*2;i++){
b[i]=a[w];
w--;
}
return b;
}
int main()
{
double nums[2]={1.23,5.364};
double *pnums = copy_and_reverse(nums, 2);
delete[] pnums;
}
还请注意,内存是在函数中分配的,所以在主要情况下,您希望使用[]删除它。
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- C++语法头文件错误
- 如何摆脱错误c2061;语法错误 cout?
- 语法错误:D3DX10Core 中的标识符'TEXTMETRICA'
- 错误 C2146:语法错误:标识符"A1"之前缺少","
- main.cpp(11):错误 C2059:语法错误:"字符串"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 如何修复此 FSM C++语法错误 C3867
- 函数错误 C2059:语法错误:'>'不起作用
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- system() 返回错误语法错误:"("意外
- C++图形初始化错误(语法或丢失文件缺陷?
- 获取0:1(1):错误:语法错误,尝试编译着色器时意外$end
- Visual Studio错误:语法错误:标识符