我有两个问题:
1)如何创建一个指向整数对象的数组?
int* myName[5]; // is this correct?
2)如果我想返回一个指向数组的指针,指向对象(如(1))我该如何在方法中执行此操作? ie)我想暗示这个方法:
int **getStuff() {
// what goes here?
return *(myName); // im pretty sure this is not correct
}
感谢您的帮助!
答案 0 :(得分:5)
如何制作指向数组的数组 对象?
int * myName[5]; /* correct */
如果我想返回一个指针 数组,指向对象(如 (1))我怎么能在方法中做到这一点?
从技术上讲,你写这个函数:
int * (* getStuff() )[5] {
return &myName;
}
返回指向该数组的指针。但是,你不想那样做。您想要返回指向数组第一个元素的指针:
int ** getStuff() {
return myName; /* or return &myName[0]; */
}
这样,您现在可以根据需要访问项目getStuff()[0] = &someInteger;
答案 1 :(得分:2)
请注意您的代码,
int* myName[5];
声明一个包含5个值的数组,每个值都是“指向int的指针”,这就是你所要求的。
然而,这就是C ++,就是这样。作为Python脚本编写者,这可能会给您带来一些惊喜。
它没有给出任何5个指针的敏感值,并且它不会创建任何整数指向它们。
如果将它放在函数体中,则会在堆栈上创建数组。这意味着当当前作用域结束时,数组将不再存在(简单来说,这意味着当你到达封闭的近卷曲时,所以例如返回它)。所以特别是,下面的代码很糟糕:
int **myFunction() {
int *myArray[5];
return myArray;
} // <-- end of scope, and return takes us out of it
它可能会编译,但该函数会返回一个指针,指向调用者看到它时不再存在的内容。这导致我们称之为“未定义的行为”。
如果你希望数组存在于它创建的函数之外,你可以在每次调用函数时在堆上创建一个数组,并返回一个指针,如下所示:
int **myFunction() {
int **myArray = new int[5];
return myArray;
}
该函数每次调用时都会返回一个不同的数组。当调用者完成它时,它应该销毁数组,如下所示:
delete[] myArray;
否则它永远不会被释放,并且会永久地使用内存(或者当你的程序在大多数操作系统上退出时)。
或者,您可以使用关键字“static”创建一个具有“全局存储持续时间”的数组(意味着只要程序正在运行它就存在,但每次只有一个而不是新的) 。这意味着该函数每次调用时都会返回相同的数组。调用者可以在其中存储一些指针,忘记它,再次调用函数,并看到仍然存在相同的指针:
int **myFunction() {
static int *myArray[5];
return myArray;
}
请注意此代码与之前非常糟糕的代码有多相似。
最后,如果你只想创建一个整数数组,而不是一个指向整数的指针数组,你可以这样做:
int myArray[5] = { 1, 2, 3, 4, 5};
实际上创建了5个整数(意思是,它指定了可以存储整数值的空间。这与指针数组不同,后者存储用于存储整数值的空间地址)。
它还将指定值存储在该空间中:myArray [0]现在为1,myArray [1]为2,等等。
答案 2 :(得分:1)
1)正确 - 这是一个包含int
s
2)通过返回指向该数组第一个元素的指针,可以返回指向int
指针数组的指针。这有两个间接级别,因此您需要两个星号。您也可以正常返回数组,因为数组会自动衰减成指向其第一个元素的指针。
int **getStuff() {
return myName; // 1
return &myName[0]; // 2
}
答案 3 :(得分:1)
int **myName;
int **getStuff() {
int **array = new int*[5];
for (int i = 0; i < 5; i++)
{
int key = i;
array[i] = &key;
}
return array;
}
答案 4 :(得分:0)
int **myFunction() {
int **myArray = new int*[5];
return myArray;
}
答案 5 :(得分:0)
这将返回一个堆数组指针(不是指向其元素的指针),可测试和可删除。什么都没有泄漏。
template <class T>
T* newarray(int len)
{
T *a;
try
{
a = new T[len];
memset(a,0,len*sizeof(T));
return a;
}
catch (...)
{return 0;}
}
。 。
void foo()
{
float *f=0;
f=newarray<float>(1000000);
if(!f) return;
//use f
delete [] f;
}