2009-10-07 3 views
0

Я хочу знать, что происходит в памяти, когда вы объявляете:Что создает (int ** array;)?

int **array; 
+0

не является удобным инструментом командной строки, которая объясняет C-определений в почти равнину-английски? Я не могу найти этот инструмент прямо сейчас. – abelenky

+0

K & R «Язык программирования C» (2-е издание), стр. 122, содержит программу, которая будет транслировать декларации C в удобочитаемое английское объяснение; http://packages.debian.org/sid/cdecl расширенная версия может быть найдена в Интернете. – ephemient

+0

cdecl. Вот одна реализация: http://linux.maruhn.com/sec/cdecl.html – dmckee

ответ

6

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

8

Это создает переменный для хранения указателя на указатель Int.

2

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

4

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

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

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

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

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

1

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

У вас есть многомерный массив 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 

} 
+0

Это технически правильно, но не отвечает на исходный вопрос. –

+0

На самом деле я новичок в этом месте. Что происходит в памяти, указывается sth. Я дал дополнительную информацию, которая не из темы. Высказывание ** ar АДРЕСА для arr [0] [0] OBVIOUSLY означает «вы только объявляете указатель, точно так же, как * p» Это вне формата? Я спрашиваю, потому что я действительно удивляюсь этому. – JCasso

+1

Наверху, потому что ответ правильный.Просто потому, что это не совсем точно то, что хотел расспрашивать, не делает его достойным увольнения. –