2011-12-26 2 views
1

이것은 매우 간단한 질문이지만 누구에게나 질문을하면 대답을 할 수 없습니다. 2 차원 배열에서 행과 열을 지정해야합니다. 맞습니까? 예를 들어 : 우리는 당신이 코드의 조각에서 보는 바와 같이 (언급) 행을 작성 해달라고하면 그 좋아 프로그래밍에2 차원 배열에서 C++ 왜 우리는 항상 열의 개수를 언급해야합니까?

void foo(int towers **[ ][ 3 ]** , int rings) 
{ 
    for (int ring = 0; ring < rings; ring++) 
    { 
    ... towers[ ring ][ 0 ]... 
    } 
} 

하지만 ALWYAS 상관없이 열 수를 쓸해야합니다. 그래서 우리는 왜 열의 수를 써야하는지 그 논리적인 이유는 무엇입니까? 우리가하지 않으면 어떻게 될까?

+0

당신은 마치 각 포인터가 행을 가리키는 포인터의 배열을 전달하는 것처럼 생각할 수 있습니다. 따라서 2D 배열을 "Func (int (* towers) [3])"로 전달할 수도 있습니다. – Arunmu

+0

일반적으로 의미하는 바는이 코드는 예제에 불과합니다. – sam

+0

위의 이유는 일반적으로 마찬가지입니다. 열 수가 "Y"인 경우 2D 배열을 여전히 "Func (int (* arr2) [Y]) {}"로 사용할 수 있습니다. :). 이것은 또 다른 방법 일뿐입니다. – Arunmu

답변

3

2 차원 배열에 액세스하려고 할 때마다 배열 [a] [b]의 두 가지 인덱스를 지정합니다. C++은 예를 들어 .. array[n][...]의 모든 요소는 다음 메모리의 다음 비트 array[n+1][...] 등을 위해 사용되는 모든 n 메모리에 인접 보장 : 그래서

   array[0][0] ((T*)array) 
       array[0][1] ((T*)array) + 1 
       array[0][2] ((T*)array) + 2 
       array[1][0] ((T*)array) + 3 
       array[1][1] ((T*)array) + 4 
       ... 

배열 [A]의 절대 메모리 어드레스 배열] 배열에서 [A] [B]는 다음과 같습니다.

((T*)array) + a * B + b; 

계산 방법에 B가 필요하지만 A는 필요하지 않은지 확인하십시오. 마찬가지로, 컴파일러는 가장 왼쪽의 인덱스를 제외한 나머지를 모두 제공해야한다고 주장합니다.

컴파일러에서 [a] 또는 과거 A의 값으로 색인을 작성하려고 시도하지 않았지만 언어가 그런 확인을하지 않는다는 것이 확인되면 어떤면에서 좋을 것입니다. 프로그래머는 코드가 어레이를 안전하게 색인화하도록하십시오. 안전을 원할 경우 런타임 색인 검사에는 std::vector<>at()을 사용하거나 컴파일 타임에 컴파일 타임 상수 색인을 검사하는 고정 크기 배열 기법을 쓸 수도 있습니다. 일반적으로 색인은 런타임에 달라 지므로 그다지 유용하지는 않습니다.

+0

고마워요,하지만 내 친구가 원인을 언급했다. [] 컴파일을 삭제하면 (미안하지만 더 잘 설명하는 방법을 모른다.) 따라서 같은 크기의 배열이 두 개있을 수 있으므로 혼란 스럽다. [], 배열에 값을 할당하는 것을 모른다. – sam

+0

@sam : 친구의 의견에 대한 귀하의 설명을 이해할 수 없어서 적절하게 의견을 말할 수 없습니다. 말하자면 코드 호출을 호출 할 때'foo (my_towers, 4)'라고''유망한''foo'인데'0 <= a

1

2 차원 배열이 메모리에 어떻게 저장되어 있는지 알 수 있습니다. 크기가 [n] [m]이면 메모리에서 n x m 연속 셀을 사용합니다. 이후에 요소 [a] [b]에 대한 질문을 받으면 이러한 연속적인 셀에서 요소 a * m + b를 취하는 계산이 있습니다. 그러나 열 수를 제공하지 않으면이 계산을 수행 할 수 없습니다 (그렇지 않으면 m을 알 수 없기 때문입니다).

한편, 열과 행의 수는 배열의 메모리 부분에 저장되지 않으며 열 수는 메모리에서 파생 될 수 없습니다. 이 모든 것은 컴퓨터가 사용자에게 서비스 할 메모리 주소를 알지 못함을 의미합니다.

관련 문제