2013-07-30 3 views
-1

어떤 경우에는 포인터 포인터가 매트릭스로 설명됩니다. 왜 이런 식으로 작동하는지 설명 할 수 있습니까? 어느 C 속성에서 허용됩니까?왜 포인터에 대한 포인터가 매트릭스입니까?

답변을 게시하지 마십시오 포인터가 항상 매트릭스가 아닌 포인터. 나는 그것을 알고 있지만 어떤 상황에서는 그것이 왜 매트릭스인지를 묻는다.

+0

태그의 프로그래밍 언어를 지정하십시오 및 당신이 의미하는 것을 설명하는 코드 샘플을 제공하십시오. –

+0

행렬 요소가 메모리에 연속적으로 저장되는 경우 (이는 매우 일반적입니다) 단지 포인터에 대한 포인터가 아닌 첫 번째 요소에 포인터를 전달하기 만하면됩니다. 행렬이 메모리에 어떻게 배열되는지에 달려 있습니다. 링크 된 목록으로 표시되는 희소 행렬이거나 완전히 다른 것일 수 있습니다. –

+0

"왜 포인터가 배열인지 알고 있습니까?" (일부 표현식에서) –

답변

7

opeator [] 인라인 구현으로 인해. a[b] 실제로는 *(a + b)

따라서 첫 번째 []은 행을 선택하고 두 번째는 열을 선택합니다. 그래서 그것은 stepOne = *(arr + M) 여기서 M = m * nstepTwo = stepOne[n], *(stepOne + n)와 동일

같은 arr[m][n]이다. 이 체인 후에 우리가 진실이 무엇인지 확인하기 위해 arr[m][n]*(arr m*n + n)

와 동일한 것을 볼 그래서 내가 E.이이 int M[6][7] 말할 수 있습니다 항목 문자 표시이 짧은 프로그램

int main() 
{ 
    char arr[10][15]; 
    std::cout << sizeof(arr) << std::endl;   //150 
    std::cout << sizeof(*arr) << std::endl;   //15 
    std::cout << sizeof(arr[0]) << std::endl;  //15 
    std::cout << sizeof(*arr[0]) << std::endl;  //1 
    std::cout << sizeof(**arr) << std::endl;   //1 
    std::cout << sizeof(arr[0][0]) << std::endl;  //1 

    std::cout << arr << std::endl;     //some number 
    std::cout << arr+1 << std::endl;     //some number + 15 
    std::cout << &arr << std::endl;     //some number 
    std::cout << &arr+1 << std::endl;     //some number + 150 

    return 0; 
} 



       +---+---+---+---+---+---+---+ 
This is matrix: | E | | | | | | | 
       +---+---+---+---+---+---+---+ 
       | | | | | | | | 
       +---+---+---+---+---+---+---+ 
       | | | | | | | | 
       +---+---+---+---+---+---+---+ 
       | | | | | | | | 
       +---+---+---+---+---+---+---+ 
       | | | | | | | | 
       +---+---+---+---+---+---+---+ 
       | | | | | | | | 
       +---+---+---+---+---+---+---+ 

를 확인할 수 있습니다. 그래서 역방향으로 갈 수 있습니다.

  1. &M - 매트릭스에 대한 포인터. 하나를 증가 시키거나 감소 시키면 다른 데이터를 얻게됩니다. 왜냐하면 sizeof(M)sizeof(int) * 7 * 6
  2. &M[0] 행렬의 첫 번째 행에 대한 포인터와 같기 때문입니다. 값을 늘리면 sizeof(M[0])sizeof(int) * 7과 같으므로 다음 행으로 이동합니다.
  3. 포인터를 입력하려면 &(M[0][0])sizeof(M[0][0])을 입력해야합니다. sizeof(int)과 같습니다. ... 나는이 물건을 설명하는 매우 좋은 아니에요 때문에

      +---+---+---+---+---+---+---+ 
    M[0] ----> | E | | | | | | | 
          +---+---+---+---+---+---+---+ 
    
           +---+ 
    M[0][0] ----> | E | 
           +---+ 
    

    내가 그래프 도움을 희망 BTW

    하나 더 : 그래서

이 모든에서 그래프를 만들려면 포인터에 대한 포인터는 항상 매트릭스가 아닙니다.

+0

다이어그램이 필요한 경우 [read] (http://stackoverflow.com/questions/17564608/what-does-the-array-name-mean-in-case-of-array-of-char- 포인터/17661444 # 17661444) 2 차원 매트릭스도 설명했습니다. –

+0

포인터 포인터가 결국 행렬을 가리키는 예제를 제공하면 도움이된다고 생각합니다. –

0

포인터가 포인터 인 이유는 무엇입니까?

모든 경우에 해당되는 것은 아닙니다.

포인터는 단일 요소에 대한 포인터 일 수도 있으므로 "포인터에 대한 포인터"는 단일 요소를 가리키는 단일 포인터에 대한 포인터가 될 수도 있습니다.이 포인터 배열이다

  1. 경우

    만 포인터 포인터는 요소의 배열을 가리키는 각각

  2. , 각각
  3. 유효한 (밀도) "매트릭스"인 동일한 크기를 갖는 요소 배열이다.

(이 C++에 대한 경우 :. 대신 this 같은 1D 표현 뭔가하지만 모든 포인터에 대한 포인터 구문을 사용 붙이지 마십시오),

관련 문제