通过指针访问c ++数组

时间:2009-11-12 11:11:13

标签: c++ arrays pointers parameters

关于通过指针访问数组信息的一个简单问题,我似乎无法弄清楚。我将一堆多维数组传递给函数。现在它们不是动态的,但即使是静态的,我也必须将它们作为指针传递给它? (如果我错了,请纠正我)

因此,一旦我将它们传递给函数,我该如何访问它?

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..?
}

4 个答案:

答案 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)