如何制作动态大小的数组?动态数组的一般用法(也许是指针)?

hil*_*hev 8 c c++ arrays pointers dynamic

我正在尝试制作一个程序

  1. 接受用户输入(让我们说它全部是int)
  2. 将其存储在没有起始大小的数组中(即不是 - > array[5];); 然后
  3. 使用存储在数组中的信息用于任何险恶的目的.

我正在寻求帮助,以便我可以根据需要自行学习如何做到这一点.

  • 如何在没有设置大小的情况下制作动态数组?
  • 如何使用/访问/访问上述数组中的元素?

读书对我来说不够解释.

我知道这是一个非常无聊的问题,是的,我是一个菜鸟,但要改变我需要一些帮助.

Rob*_*tas 17

对于C++:

如果你只需要一个容器就可以使用std:vector.它会照顾您所需的所有内存分配.但是,如果你想开发自己的动态容器(无论你有什么理由),你必须自己处理内存分配.也就是说,当您的阵列增长时,您必须分配新的内存块,将当前的数组值复制到新的内存位置,并将新值添加到新分配的内存中.通常一个人将这种逻辑包装在一个单独的类中,例如GrowingArray(如标准提供的vector类)

编辑

详细说明我的答案(假设您将其用于学习目的):

将它存储在没有起始大小的数组中(即不是 - > array [5];)

在这里,您希望使用以下内容:int * myDynamicArray; 当用户输入某些值时,您将分配将要存储这些值的内存块:myDynamicArray = new int[5];使用初始输入的大小.我还建议在一些变量中保存数组的大小:int arraySize = 5; 如果稍后你想要为你的myDynamicArray第一个附加新值,你必须为增长的数组(当前数组元素+新数组元素)分配新的内存块.假设你有10个新值.然后你会这样做:int* grownArray = new int[arraySize+10];这为增长的数组分配新的内存块.然后你想要将旧内存块中的项目复制到新的内存块并添加用户附加值(我认为你将它用于学习目的,因此我为你提供了复制elemts的简单循环.你可以使用std:copy或者喜欢memcopy 以及):

int i = 0;
for (; i < arraySize; ++i)
   {
   grownArray[i] = myDynamicArray [i];
   }
// enlarge newly allocated array:
arraySize+= 10;
for (; i < arraySize; ++i)
   {
   grownArray[i] = newValues from somewhere
   }
// release old memory
delete[] myDynamicArray;
// reassign myDynamicArray pointer to point to expanded array
myDynamicArray = gronwArray;
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 13

这可能是最聪明的(对某些人来说神秘的过度STL使用)方式......

std::vector<int> vec;

// read integers 1 at a time from the user,
// will stop when non-integer input is entered
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(), 
          std::back_inserter(vec));

// print out the vector
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)

  • 这里唯一的答案是值得的. (3认同)

aus*_*tin 7

这是我用C++编写的一些基础知识的代码.

#include <iostream>

int main(int argc, char *argv[])
{
    int* my_dynamic_array;

    int size;
    std::cin >> size;

    my_dynamic_array = new int[size];

    for (int k=0; k<size; k++)
        my_dynamic_array[k] = k;

    for (int k=0; k<size; k++)
        std::cout << my_dynamic_array[k] << std::endl;

    delete[] my_dynamic_array;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

好的,这就是这段代码中发生的事情.我们使用std :: cin提示数组的大小,然后使用new关键字为数组动态分配一些内存.这里有一些细节,一开始看起来有点奇怪; 它似乎与许多新的C++开发人员混淆了.

所以首先我们使用指针而不是数组声明来声明我们的动态数组,例如我们使用int *my_dynamic_array而不是int my_dynamic_array[].起初这看起来很简单,但是你需要了解C和C++中发生的事情.

当您静态声明一个数组时,您告诉程序您要将该内存留出来供您使用.它实际上在那里; 这是你的开始使用.动态创建数组时,首先使用指针.指针只是对某些记忆的引用.那个记忆还没有分配.如果你尝试用它来访问它my_dynamic_array[3],你会得到一个令人讨厌的错误.那是因为那个位置的内存中没有任何内容(至少没有给程序使用).

另请注意使用delete[]而不是delete.这就是你完成数组后释放内存的方式.

如果你在C中这样做,你几乎可以用同样的方式来思考,但不是newdelete[]你有mallocfree.

了解动态数组和指针之间的细微差别是棘手的.我花了一段时间才完全理解发生了什么.祝你好运并坚持下去.