关于通过指针访问数组信息的一个简单问题,我似乎无法弄清楚。我将一堆多维数组传递给函数。现在它们不是动态的,但即使是静态的,我也必须将它们作为指针传递给它? (如果我错了,请纠正我)
因此,一旦我将它们传递给函数,我该如何访问它?
int main()
{
int anArray[5][5] = // member intializations
foo(*anArray);
}
void foo(int * anArray) //or should that be int ** anArray ??
{
cout << anArray[2][2] << endl; // how should i address this..?
}
答案 0 :(得分:3)
如果您的阵列大小固定,您可以这样做:
void foo(int arr[5][5])
{
cout << arr[2][2] << endl;
}
答案 1 :(得分:3)
数组是在内存中连续布局的一系列对象。
int blah[5][10];
是一个5 [数组10 [int] s]的数组。
例如,blah[0]
将为您提供10个整数的第一个数组,blah[1]
将为您提供第二个,等等。
为了能够计算内存偏移量,C需要准确知道每个“子阵列”中有多少元素。
所以你可以这样做
void foo(int anArray[][10]) {
cout << anArray[2][2] << endl;
}
或者
void foo(int anArray[5][10]) {
cout << anArray[2][2] << endl;
}
但你不能[][]
。
与
完全不同void foo(int *anArray[10]) { //array of 10 pointers
或
void foo(int **anArray) { //pointer to pointer (could be a pointer to an array of pointers to more arrays)
如果您事先不知道数组的尺寸,则必须使用更复杂的数据结构。也许将数组的宽度/高度传递给函数(或使用包含该信息的结构)并将2维解析为1维数组,如下所示:
int *arr = malloc(width*height * sizeof(int));
...
cout << arr[x + y * width] << endl;
答案 2 :(得分:1)
您可以像访问数组一样访问指针。所以你的“foo”功能是正确的。我在您的代码中看到的主要问题是这一行
foo(*anArray);
将其更改为
foo(anArray);
或者如果你想要真正明确
foo(&anArray[0][0])
现在错误......嗯...几点指示。由于指针是一个数组指针,你可以真正射击自己的脚。例如,在foo中,您知道传入的内存是指针,但您可能还希望传达其大小以进行适当的检查。许多缓冲区溢出是由于对不正确的数组大小的假设造成的。这称为缓冲区溢出,并且可能导致您无意中覆盖程序内存的其他部分(希望程序的内存)导致非常奇怪的行为。例如,程序中的堆栈变量可能会突然显示未分配的值。
如果你有权访问std :: vector或boost :: array,我会推荐那些以避免缓冲区溢出的任何问题。
答案 3 :(得分:1)
在C ++中,数组实际上是指向第一个元素的指针 当传递* anArray,其中anArray是anArray [5] [5]时,你传递的是单元格anArray [0]的内容,它是一个指向整数数组的指针,
所以foo函数应该接收一个指针:void foo(int * intanArray)