使用指针显示数组的值

Displaying values of an array using pointers

本文关键字:数组 显示 指针      更新时间:2023-10-16

我的问题的图像:https://i.stack.imgur.com/x5VQW.png

总而言之,在一个函数 readNumbers 中,我将创建一个大小为 10 的数组,并返回指向该数组的指针。 然后我有第二个函数 printNumbers,它从上面的函数中获取指针(以及数组的长度 10(并打印数组中的索引和相应的值。

我的函数文件:

#include <iostream>
using namespace std;
int *readNumbers() 
{
int arr[10];
for (int i=0; i<10; i++) //asking for 10 values
{
cout<<"Enter an element: ";
cin>>arr[i];
}
int *arrPtr;
arrPtr=&arr[0];
return arrPtr;
}


void printNumbers(int *numbers,int length) 
{

for (int i=0; i<length; i++)
{
cout<<i<<" "<<*(numbers+1)<<endl;
}
delete numbers;
}

主文件:

int *readNumbers() ;
void printNumbers(int *numbers,int length) ;
int main (void)
{

printNumbers(readNumbers(), 10) ;

}

代码编译,但是,打印的数组元素不是已馈送到编译器的内容。

另外,问题天数要删除数组。这与清除堆空间有关吗?这是通过删除指向数组的指针来实现的,就像我在第二个函数中所做的那样吗?

谢谢。

在您的函数中,您静态分配大小为 10 的数组,因此它仅在函数退出之前存在。之后,你会得到未定义的行为,因为你正在从不再属于你的内存中读取随机字节。

您想要的是动态分配数组,这可以使用new轻松完成

int* arr = new int[10];

然后你只需return arr;

当然,一旦你用完了记忆,不要忘记通过调用delete[]来清除内存(而不是没有大括号delete(。

作为旁注,调用return arrPtr与调用return arr相同,后者会自然衰减到指针。这只是错误的,因为该指针最终指向不再存在的东西。

我稍微修改了您的代码,以便它执行您的作业 https://i.stack.imgur.com/x5VQW.png 中要求的内容

我的代码:

#include <cstdlib>
#include <iostream>
using namespace std;
int *readNumbers() {
int *arr = new int[10];
for (int i = 0; i < 10; i++) //asking for 10 values
{
cout << "Enter an element: ";
cin >> arr[i];
}
return arr;
}
void printNumbers(int *numbers, int length) {
for (int i = 0; i < length; i++) {
cout << i << " " << numbers[i] << endl;
}
delete[]numbers;
}
int main() {
printNumbers(readNumbers(), 10);
return 0;
}

回答你的第一个问题:本地数组,比如这个int array[10];,在堆栈上分配,当它们所在的函数结束时被销毁。这就是为什么当您稍后尝试打印出数组的内容时,您从内存中读取随机字节的原因。

当我们编写int *arr = new int[10];时,我们将数组分配给一个堆。返回该数组的地址并将其分配给名为arr的指针。指针arr依次在堆栈上分配。 但是,当您使用new运算符在堆上分配某些内容(例如数组(时,当您不再需要它来释放数组时,您应该使用它delete运算符。否则,如果您继续使用new而以后不使用delete,您的堆空间将不足,并且您的程序将崩溃。

回答第二个问题:当您使用运算符(如果是数组deletedelete[](时,您实际上是在删除指针指向堆上arr内容。使用delete运算符后,指针arr不会自行从堆栈中删除。它变成了所谓的"悬空指针" - 不再指向堆上有效内容的指针。当我们终止声明它的函数(范围(以及我们可能拥有的其他局部变量时,它将从堆栈中删除。但是,删除指针指向的内容后,可以为其分配 NULL (arr = NULL;(,以指示它不再引用任何内容。