доступ к массиву c ++ через указатель - PullRequest
1 голос
/ 12 ноября 2009

Простой вопрос о доступе к информации массива через указатели, который я не могу понять. Я передаю кучу многомерных массивов в функцию. Теперь они не являются динамическими, но даже если они статические, я должен передавать их как указатели, верно? (Если я ошибаюсь, пожалуйста, поправьте меня)

Итак, как только я передам их в функцию, как мне получить к ней доступ?

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 ]

3 голосов
/ 12 ноября 2009

Если ваши массивы имеют фиксированный размер, вы можете сделать это следующим образом:

void foo(int arr[5][5])
{
    cout << arr[2][2] << endl;
}
3 голосов
/ 12 ноября 2009

Массив - это серия объектов, последовательно расположенных в памяти.

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 измерения в одномерный массив, например, так:

int *arr = malloc(width*height * sizeof(int));
...
cout << arr[x + y * width] << endl;
1 голос
/ 12 ноября 2009

в C ++ массив на самом деле является указателем на первый элемент.
при передаче * anArray, где anArray - это anArray [5] [5], вы передаете содержимое ячейки anArray [0], которая является указателем на целочисленный массив,

поэтому функция foo должна получать указатель: void foo (int * intanArray)

1 голос
/ 12 ноября 2009

Вы можете получить доступ к указателю так же, как вы можете получить доступ к массиву. Так что ваша функция "foo" правильная. Основная проблема, которую я вижу в вашем коде, это строка

foo(*anArray);

изменить на

foo(anArray);

или если вы хотите быть действительно откровенным

foo(&anArray[0][0])

Теперь ... ну ... несколько указателей. Поскольку указатель является массивом, это указатель, вы действительно можете выстрелить себе в ногу. Например, в foo вы знаете, что передаваемая память является указателем, но вы, вероятно, также хотите сообщить ее размер для соответствующей проверки. Многие переполнения буфера возникли в результате предположения о неправильном размере массива. Это называется переполнением буфера и может привести к непреднамеренному перезаписи памяти в других частях памяти вашей программы (надеюсь, что ваша программа) вызывает очень странное поведение. Например, переменная стека в вашей программе может внезапно принять значение, которое ей не было присвоено.

Если у вас есть доступ к std :: vector или boost :: array, я бы порекомендовал их, чтобы избежать проблем с переполнением буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...