我需要实现一个修改数组的函数。新阵列可以是不同的大小。 cout
打印1.我理解这段代码的错误,但我无法弄清楚语法是什么。
//tried this..
int reduce(int *array[])
{
*array = new int[1];
(*array)[0] = 6;
return 0;
}
//also tried this..
int reduce(int array[])
{
array = new int [1];
array[0] = 6;
return 0;
}
int main()
{
int a[1] = {1};
int *p = a;
reduce(&p);
cout << a[0];
return 0;
}
答案 0 :(得分:0)
修改:
你想修改数组a,试试这个:
int reduce(int **array)
{
*array = new int[1];
(*array)[0] = 6;
return 0;
}
int main()
{
int *a = new int[1];
reduce(&a);
cout << a[0];
return 0;
}
答案 1 :(得分:0)
无法正确理解您的问题,但您可以这样做:
void reduce(int *a, int size)
{
for (int i =0; i < size; ++i) {
*(a+i) = 6; // or whatever value to want to
}
}
这样称呼:
int main(){
int a[5] = {1, 1, 1, 1, 1};
int *p = a;
reduce(p, 5);
for (int i =0; i < 5; ++i) { cout << a[i]<<endl; }
return 0;
}
修改强>
你想做的事情可以用这种方式模糊地完成:
int * reduce (int **b, int size) {
*b = new int[size];
for (int i =0; i < size; ++i) {
*(*b + i) = 6;
}
return *b;
}
int main(){
int a[5] = {1, 1, 1, 1, 1};
int *p = a;
p = reduce(&p, 5);
cout << p[0];
cout << p[1];
cout << p[2];
cout << p[3];
cout << p[4];
delete [] p;
return 0;
}
但它仍然不会改变a
指向的位置。
答案 2 :(得分:0)
使用静态定义的数组无法实现您的目的。
使用类似
的数组时int a[1] = {1};
您无法在运行时更改数组的大小,您无法使其指向动态分配的内存。您只能访问和修改数组中的元素。就是这样。
函数reduce
会更改p
指向的位置,但不会更改a
的元素。
如果要修改a
的内容,只需使用a
作为参数,然后设置值。
答案 3 :(得分:0)
首先,形式参数int* array[]
实际上与int** array
相同(您可以将其视为二维数组)。这可能不是你想要的。
@everettjf的答案只有在不更改数组大小时才有效。一个可能的解决方案(完全取代数组)将是
#include <iostream>
void print_array(int[],int);
int* reduce(int array[]) {
// get rid of the old array
delete[] array;
// create a new one
array = new int[7]{8,4,6,19,3,56,23};
// need to return the new address, so that
// the main function is informed on the new
// address
return array;
}
int main() {
// initialize array
int *a = new int[1]{4};
print_array(a,1);
// "change" array by completely replacing it
a=reduce(a);
print_array(a,7);
return 0;
}
// simply prints out the array; no error checking!
void print_array(int array[], int length) {
std::cout << "[";
for (int i = 0; i < length ; ++i) {
std::cout << array[i] << " ";
}
std::cout << "]" << std::endl;
}
在reduce
函数中,初始数组被完全删除。之后,您可以创建一个新的(我选择使用7个随机数)。将该指针返回给调用者(main
方法)非常重要。否则,main方法中的a
指针将指向无效
如果你没有强迫(例如通过某种练习)使用数组,你应该研究http://en.cppreference.com/w/cpp/container/vector
答案 4 :(得分:0)
您的问题的前提是无效的。在标准C ++中通过任何方式定义后,无法调整自动存储持续时间数组(a
中的main()
)。
reduce()
个功能中的动态内存分配不会导致a
中的main()
调整大小。
reduce(&p)
将调用reduce()
的第一个版本,然后更改p
(因此它指向动态分配的内存),但不会影响a
。
如果main()
调用reduce(a)
或reduce(p)
(两者相同,则初始化int *p = a
)将同时更改a
和p
,但反而导致内存泄漏。
我怀疑,潜在的问题是你错误地认为 - 指针和数组是一回事。它们实际上是不同的东西,但可以在各种环境中以相同的方式使用。而且你的代码是不能互换使用的上下文之一。
如果你想要一个可调整大小的数组,请使用静态容器(如std::vector<int>
)和 - 如果你想要一个函数来调整它的大小,可以通过引用传递它。它动态管理自己的内存,因此能够动态调整自身大小。