如何制作动态大小的数组? 动态数组的一般用法(也许是指针)?
我正在尝试制作一个程序
- 接受用户输入(假设所有这些都是
int
) - 将它存储在没有起始大小的数组中(即不是 – >
array[5];
); 然后 - 使用存储在数组中的信息用于任何险恶的目的。
我正在寻求帮助,以便我可以根据需要自行学习如何做到这一点。
- 如何在没有设置大小的情况下制作动态数组?
- 如何使用/访问/访问上述数组中的元素?
阅读对我来说不够解释。
我知道这是一个非常无聊的问题,是的,我是一个菜鸟,但要改变我需要一些帮助。
对于C ++ :
如果你只需要一个容器,只需使用std:vector
。 它会照顾您所需的所有内存分配。 但是,如果你想开发自己的动态容器(无论你有什么理由),你必须自己处理内存分配。 也就是说,当您的arrays增长时,您必须分配新的内存块,将当前的数组值复制到新的内存位置,并将新值添加到新分配的内存中。 通常一个人将这种逻辑包装在一个单独的类中,例如GrowingArray
(就像标准提供的vector
类一样)
编辑
详细说明我的答案(假设您将其用于学习目的):
将它存储在没有起始大小的数组中(即不是 – > array [5];)
在这里你想要使用这样的东西: int * myDynamicArray;
当用户输入一些值时,您将分配将要存储这些值的内存块: myDynamicArray = new int[5];
与您的初始输入的大小。 我还建议在一些变量中保存数组的大小: int arraySize = 5;
如果稍后要将新值附加到myDynamicArray
首先必须为增长的数组(当前数组元素+新数组元素)分配新的内存块。 让我们说你有10个新值。 然后你会这样做: int* grownArray = new int[arraySize+10];
这为成长的数组分配了新的内存块。 然后你想要将旧内存块中的项目复制到新的内存块并添加用户附加值(我认为你将它用于学习目的,因此我提供了简单的循环复制elemts。你可以使用std:copy
或c像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;
这可能是最聪明的(对某些人来说神秘的过度STL使用)方式……
std::vector vec; // read integers 1 at a time from the user, // will stop when non-integer input is entered std::copy(std::istream_iterator (std::cin), std::istream_iterator (), std::back_inserter(vec)); // print out the vector std::copy(vec.begin(), vec.end(), std::ostream_iterator (std::cout, " "));
这是我在C ++中编写的一些基础知识的代码。
#include 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
好的,这就是这段代码中发生的事情。 我们使用std :: cin提示数组的大小,然后使用new关键字为数组动态分配一些内存。 这里有一些细节,一开始看起来有些奇怪; 它似乎与许多新的C ++开发人员混淆了。
所以首先我们用指针而不是数组声明来声明我们的动态数组,例如我们使用int *my_dynamic_array
而不是int my_dynamic_array[]
。 起初这看起来很简单,但是你需要了解C和C ++中发生的事情。
当您静态声明一个数组时,您告诉程序您要将该内存留出来供您使用。 它实际上在那里; 这是你的开始使用。 动态创建数组时,首先使用指针。 指针只是对某些记忆的引用。 那个记忆还没有分配。 如果您尝试使用my_dynamic_array[3]
访问其中的某些内容, my_dynamic_array[3]
出现令人讨厌的错误。 那是因为那个位置的内存中没有任何内容(至少没有给程序使用)。
另请注意使用delete[]
而不是delete
。 这就是你完成数组后释放内存的方式。
如果你在C中这样做,你可以用同样的方式想到这一点,但不是new
和delete[]
你有malloc
和free
。
了解动态数组和指针之间的细微差别是棘手的。 我花了一段时间才完全理解发生了什么。 祝你好运并坚持下去。
在C中,您可以使用此方法。
int i=0; int *p; char c; int size; printf("Enter size :"); scanf("%d",&size); int *p=malloc(sizeof(int)*size); do { printf("Enter Number : "); scanf("%d",&p[i]); i++; printf("Press 'q' or 'Q' to quit or any other key to continue : "); scanf("%c",&c); } while(c!='q' && c!='Q' && i<=size); p=realloc(p,i*sizeof(int));
这样,如果所需的整数数小于分配的内存,则可以释放分配的其余内存。
我给你一个建议。 如果要使用C开发,可以使用链表而不是数组
以下是一个例子:
typedef struct linked_list { int x, struct linked_list *next } linked_list; struct linked_list *head = NULL; void add_element(int x) { struct linked_list *elem; elem = malloc(sizeof(struct linked_list)); elem->x =x; elem->next = head; head = elem; } int main() { int x; struct linked_list *p; do { printf("Enter Number : "); scanf("%d",&x); add_element(x) printf("Press 'q' or 'Q' to quit or any other key to continue : "); scanf("%c",&c); }while(c!='q' && c!='Q'); for (p=head;p!=NULL;p=p->next) { printf(%d\r\n",p->x); } }