Что создает (int ** array;)? - PullRequest
       11

Что создает (int ** array;)?

2 голосов
/ 08 октября 2009

Я хочу знать, что происходит в памяти, когда вы объявляете:

int **array;

Ответы [ 5 ]

8 голосов
/ 08 октября 2009

Создает переменную для хранения указателя на указатель int.

6 голосов
/ 08 октября 2009

Компилятор резервирует четыре байта (в 32-битной системе, восемь байтов в 64-битной) для хранения указателя (который указывает на другой указатель, который указывает на int). Дальнейшее выделение памяти не производится, программисту остается фактически установить указатель, указывающий на какое-то другое место в памяти, где хранится int* / array / ....

4 голосов
/ 08 октября 2009

Вы объявляете переменную указателя, поэтому вы выделяете достаточно места для одного адреса памяти (зависит от вашей платформы / компилятора / и т. Д.)

Система типов гарантирует, что единственные адреса, которые вы назначаете для нее, содержат другие адреса памяти, и что эти адреса представляют фактический адрес целочисленной переменной.

Чтобы использовать указатель на указатель, вы разыменовываете его один раз (чтобы получить адрес, который фактически указывает на целое число), а затем второй раз (чтобы получить действительное целое число).

Вы можете обойти систему типов, явно приведя к чему-то другому (например, i = & pDouble), но это не рекомендуется, если вы не уверены, что знаете, что делаете.

Если у вас есть двумерный массив, вы можете представить его концептуально как один одномерный массив одномерных массивов, представляющих строки. Первым уровнем косвенности будет выбор строки, а другим - ячейка в строке.

3 голосов
/ 08 октября 2009

Если я не ошибаюсь ...

У вас есть многомерный массив arr[i][j] и

**arr адресов arr[0][0]

*((*arr)+1) адресов к arr[0][1]

*(*(arr+1)+1) адреса для arr[1][1]

Пример кода на C ++

#include <iostream>

using namespace std;

int main()
{
int **arr;

arr = new int*[5];

for(int i = 0; i < 5; i++)
    arr[i] = new int[5];

arr[0][1] = 1;

cout << *((*arr)+1); // prints 1
cout << arr[0][1] = 1; // prints 1

}
3 голосов
/ 08 октября 2009

Это указатель на указатель типа int. Это часто используется для объявления двумерного массива, в этом случае каждый указатель int является массивом, а двойной указатель является массивом массивов.

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