2013-06-13 3 views
1

변수를 정의하는 경우 :
int (**a)[30];
포인터입니다. 이 포인터는 30 개의 int 배열을 가리키는 포인터를 가리 킵니다.
선언하거나 초기화하는 방법은 무엇입니까?배열 주소 주소

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

모두 작동하지 않습니다. 그것은 약자로 사용자가 질문에 대한 답변을 원하는 경우

+7

귀하의 질문은 거꾸로 작성되었습니다. 먼저 원하는 데이터 구조와 그 표현 방법을 파악해야합니다. 고정 된 크기의 3 차원 배열을 원한다면'a'를'int a [10] [20] [30];으로 선언하고 끝내십시오. –

+1

나는 그 질문의 장점을 볼 수는 있지만, 당신이하려는 일의 장점은 알 수 없다. 그 많은 개입이 필요하겠습니까? –

+0

Java 프로그래머? C++에서는 어디서나 포인터가 필요 없습니다. – kotlomoy

답변

4

(즉, 당신이 실제로 필요의 여부) a를 초기화하는 방법에 대한 귀하의 질문에 직접 대답은 나는 이것이 당신이 비록 원하는 것을 실제로 생각하지 않는다

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

이다; 실제 배열을 가리 키도록 포인터를 초기화하고 싶고 어느 방법 으로든 std::vector이 더 좋은 방법입니다.

+0

+1 대답 : –

+0

@StuartGolodetz : 감사합니다 :) – 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] = new array [10];'그러나 typedef 없이는 어떻게하는지 알 수 없습니다. –

+0

@MooingDuck : 분명히 더 유용한 대답입니다.하지만 typedef 없이도 그렇게 할 수있는 확실한 방법은 없습니다. –

+0

'a'가 초기화되지 않았기 때문에'int (** a) [30] = create (a);'정의되지 않은 동작이 아닙니까? 이것이 이것을 막을 지 모르겠지만'create (T * const &)'가 작동 할 수도 있습니다. – Mehrdad

0

&(&var)을 작성하면 무엇을 기대합니까? 이것은 address of address of a block of memory과 같습니다. 코드에서 *의 수를 만족시키기 위해 이와 같은 작업을하는 것은 의미가 없습니다.

생각 해봐야합니다 - 어떻게 주소의 주소를 얻을 수 있습니까? 투명한 행운이나 이상한 언어 트릭으로 당신이 할 수있는 일이라 할지라도 그것이 작동 할 방법은 없습니다.

+0

'&& var'는 _temporary_ 주소의 주소이기 때문에 아무 의미가 없습니다 (심지어 컴파일되지도 않습니다). 그 중간을 비 임시로 만들면 C 라이브러리와 상호 작용할 때 주소의 주소는 실제로 공통점이됩니다. –

+1

@MooingDuck 그런 다음 주소의 주소가 아니라 다른 주소를 보유하는 변수의 주소입니다. – Dariusz

+0

아, 혼란은 "주소가 무엇"이라고 생각합니다. 두 경우 모두 주소를 보유하는 _object_가 있으므로 한 경우에는 rvalue가되고 다른 경우에는 lvalue가됩니다. –