使用数组和指针的斐波那契系列
Fibonacci series using array and pointer
以下程序应该打印到给定术语的fibonacci编号:
#include <iostream>
#include <string>
using namespace std;
int* fibo(int);
int main()
{
int num, *ptr;
cout << "How many numbers in fibonacci series? ";
cin >> num;
ptr = fibo(num);
for (int i = 0; i < num; i++)
{
cout << *(ptr + i) << " ";
}
}
int* fibo(int n)
{
int arr[50];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < n; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr;
}
但行不通。斐波那契系列的前两个要素才正确打印。
您必须将ARR更改为指针。
int *arr =new int(50);
因为您创建ARR的方式正在创建局部变量。局部变量在函数或类别存在之后被破坏。因此,在Fibo功能之后您无法保留该地址以使其之后到达ARR。
当前,您正在将fibo
退出后不再存在的数组返回一个指针。您需要使用动态内存分配
int* fibo(int n)
{
int* arr = new int[n]; // use n here because your loop does too!!
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < n; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr;
}
现在arr
指向堆上的整数数组,因此,如果 fibo()
退出,则可以安全地访问。因为它是持久的,所以您需要在完成后释放内存,因此您还必须致电
delete[] ptr;
在退出之前,在main()
中循环后。您应该看一下std::vector
做这种事情(除非这是课堂练习,并且被告知您不要这样做)
您使用的算法是正确的,但是您的C代码不正确。在您的Fibo函数中,您创建一个自动分配的数组(在堆栈上分配),这意味着该数组将在函数达到其末端后立即删除。这解释了为什么值未正确显示。
如果要更正,那么将您的数组分配在主体中,然后将该数组的指针传递给您的纤维功能?然后,您只需修改Fibo函数中的数组,而不是将指针返回到一个数组。
。int main(int argc, char * argv[]){
int arr[50];
// (...)
fibo(num, arr);
}
void fibo(int arr[50], int num){
// (...)
}
此解决方案对其他解决方案的主要优点(包括在纤维函数内动态分配数组的组成)是:
- 您不必担心内存分配。
- 堆栈分配总是比堆分配更有效。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '