如何使用指针动态分配内存?

时间:2014-03-10 14:39:46

标签: c++ arrays pointers

我有以下任务: 创建一个程序,按以下顺序将数组A转换为数组B: http://gyazo.com/29e434ebdc1e235fe0fc97c26ae9fe9c

用户输入A的大小以及元素。打印B.“使用指针”的新元素

示例:如果我输入1234567,程序将输出8888888。

这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    int N;
    cout << "Enter the size of array" << endl;
    cin >> N;
    int A[N], B[N];
    cout << "Enter the elements of the array" << endl;
    for(int i = 0; i < N; i++){
        cin >> A[i];
    }
    for(int i = 0; i < N; i++){
        B[i] = A[i] + A[N-i-1];
    }
    for(int i = 0; i < N; i++){
        cout << B[i] << " ";
    }
    return 0;
}

我只有一个问题,它说“使用指针”,但我不知道我应该在哪里使用它们并且必须使用它们......提前感谢。

2 个答案:

答案 0 :(得分:2)

int A[N], B[N];

此代码是非标准的(当N是变量时)。您的编译器允许这样做,但如果您尝试在其他代码中编译此代码,则可能无法正常工作。

在这种情况下使用指针意味着您应该动态地为数组分配内存,例如

int * A, * B;
A = new int[N];
B = new int[N];

此代码在C ++标准方面有效。

请记住,您不必再需要手动释放已分配的内存:

delete[] A;
delete[] B;

这应该可以使代码的其余部分保持不变,因为[]运算符也适用于指针。

最后,如果您真的在编写C ++程序,那么您肯定应该使用std::vector而不是C风格的数组......


编辑:(回应评论)

如果以下列方式声明变量:

int * A;

然后写:

cin >> *(A + i);

这意味着:

  1. 从用户读取数据并解析;
  2. 从地址A开始i“步骤”(它实际上从A走“i * sizeof(*A)个字节”。
  3. 将用户读取的数据放入在步骤2中评估的位置指向的内存中。
  4. 但是当你宣布:

    int (*A)[N];
    

    A成为指向N个元素数组的指针。由于数组可以转换为指向其第一个元素的指针,因此您可以将前一行(为了便于解释)视为

    int ** A;
    

    在这种情况下,编译器尝试执行与之前描述的相同的操作。但现在它从A开始i 指针,而不是* int * s。然后它取消引用指针获取int *并尝试将用户写入的数据放入其中。但是>>的{​​{1}}运算符无法将文本转换为指针,这就是编译器抱怨的原因。


    脚注

    在学习使用指针时,您可能会认为cin等于<something> variable[]指向该数组的第一个元素。这是一个谎言(因为数组不是一个指针,但它是 convertible 指向其第一个元素的指针),但有助于理解什么是数组与指针有共同之处。这就是你能想到的原因

    <something> * variable

    作为

    int (* A)[];
    

答案 1 :(得分:2)

好吧,这个

cin >> N; 
int A[N], B[N]; 

无效ANSI C ++。您不能声明具有变量索引的数组。所以你需要一种声明变长数组的方法,一种方法是使用new [](然后删除[])来使用指针和动态分配的内存。

另一种更好的方法是使用诸如std :: vector之类的容器。