2013-06-13 1 views
1

Если я определяю переменную:
int (**a)[30];
Это указатель. Этот указатель указывает на указатель, который указывает на массив из 30 целых чисел.
Как объявить его или инициализировать?Адрес адреса массива

int (**a)[10] = new [10][20][30]; 
int (**a)[10] = && new int[10]; 

Все не работает.

+7

Ваш вопрос обратный. Сначала вы должны выяснить, какую структуру данных вы хотите, а затем как ее представлять. Если вам нужен 3D-массив фиксированного размера, просто объявите 'a' как' int a [10] [20] [30]; 'и сделайте с ним. –

+1

Я вижу достоинство вопроса, но не достоин того, что вы пытаетесь сделать. Вы уверены, что вам нужно много передач? –

+0

Java-программист? В C++ вам не нужны указатели везде – kotlomoy

ответ

4

Прямой ответ на ваш вопрос о том, как инициализировать a (независимо от того, или нет, это то, что вам действительно нужно) является

int (**a)[10] = new (int (*)[10]); 

Я не думаю, что это на самом деле то, что вы хотите, хотя; вы, вероятно, хотите инициализировать указатель, чтобы указать на фактический массив, и в любом случае std::vector - лучший способ сделать это.

+0

+1 для ответа на мета-вопрос - ta :) –

+0

@StuartGolodetz: thanks :) – Mehrdad

+0

Интересно, что 'new (int (*) [10])' компилирует, но 'new (int (*) [10]) [30 ] 'не делает. –

0

Если вы хотите получить ответ на вопрос, как он стоит, то вы можете сделать такую ​​вещь:

int a[30]; 
int (*b)[30] = &a; 
int (**c)[30] = &b; 

Но это вряд ли то, что вы хотите, как и другие люди прокомментировали. Вероятно, вам нужно уточнить свою основную цель - люди могут только размышлять иначе.


Просто следовать дальше от замечания MooingDuck, я могу на самом деле вижу способ сделать это без ЬурейеЕ, но не сразу:

template <typename T> 
T *create(T *const &) 
{ 
    return new T; 
} 

int (**a)[30] = create(a); 

Это не красиво, хотя.

+1

Я получил это: 'typedef int (* array) [30]; int (** a) [30] = новый массив [10]; ', но я не могу понять, как это сделать без typedef. –

+0

@MooingDuck: Это определенно более полезный ответ - я не вижу очевидного способа сделать это без typedef, хотя и то и другое. –

+0

Не 'int (** a) [30] = create (a);' undefined behavior, так как 'a' не инициализируется? Я не уверен, что это предотвратит это, но «create (T * const &)» может работать. – Mehrdad

0

Что вы ожидаете получить, написав &(&var)? Это эквивалент address of address of a block of memory. Делать такие вещи, чтобы удовлетворить количество * в вашем коде, не имеет смысла.

Подумайте об этом - Как вы можете получить адрес адреса? Даже если вам удастся или удачливые трюки с языком вам удастся это сделать, нет никакого способа, которым это будет работать.

+0

Вы правы, что '&& var' не имеет смысла (он даже не компилируется), потому что это адрес _temporary_ address. Если вы делаете эту среднюю безвременной, то адрес адреса на самом деле является общей проблемой при взаимодействии с библиотеками C. –

+1

@MooingDuck Это не адрес адреса, а адрес переменной, которая содержит другой адрес. – Dariusz

+0

А, я думаю, что путаница - это «то, что такое адрес». Поскольку оба случая имеют _объект_, который содержит адрес, разница в одном случае является значением rvalue, а в другом случае объектом является lvalue. –

Смежные вопросы