2012-06-26 2 views
-1

은 내가 이런 식으로포인터를 사용하여 C에서 2D 배열의 요소에 액세스하는 방법은 무엇입니까?

*(*(multi+0)+1) = .... 

을 시도

multi[0][1] = .... 

포인터 예를 들어

에게 (이 사용하는 전통적인 방법)을 사용하여 C에서 2 차원 배열의 요소에 액세스하려는 그러나 그것은 나를 준다 오류가 발생했습니다

" pointer required " 

그럼 어떻게해야합니까?

사실이 내가 ( (멀티 + 0) +1)와

void state_array(int *pointer , int *multi){ 
    int i ; 
    for (i = 0 ; i < 4 ; i++){ 
    *(*(multi + i) + 0)= *(pointer+i) ; 
           } 
    for (i = 4 ; i < 8 ; i++){ 
    *(*(multi + i) + 1)= *(pointer+i) ; 
           } 
    for (i = 8 ; i < 12 ; i++){ 
    *(*(multi + i) + 2)= *(pointer+i) ; 
           } 
    for (i = 12 ; i < 16 ; i++){ 
    *(*(multi + i) + 3)= *(pointer+i) ; 
           } 
            } 
+3

'나에게 오류가 발생합니다.'와 같은 글을 게시하면 투표가 실패 할 것으로 예상됩니다. –

+2

명확히하기; 오류 메시지에 관해 질문 할 때 정확한 오류 메시지 *를 실제로 게시해야합니다. –

+0

변수'multi'의 데이터 유형은 무엇입니까? 그것은'int' 2D 배열입니까? –

답변

1

있습니다 아무 문제가 무엇을하고 있었는지입니다. 작동합니다. 오류를 찾으려면 전체 코드를 지정하십시오.

Refer the link

1

당신이 특정 오류 메시지 이유는 변수 multiint *, 그리고 int **를 입력 한 것입니다. 함수는 식을 부셔

*(*(multi + i) + j)

에 두 번 역 참조하여 int **로 취급 :

  1. *(multi + i) 포인터 multi+i를 역 참조. multiint * 유형이기 때문에 괜찮습니다. 결과 유형은 int입니다.
  2. *(... + j)... + j을 참조 취소하려는 시도. 문제는 ...이 유형이 int이고 ... + j이 유형이 int 인 것입니다. 귀하는 int을 역 참조 할 수 없습니다 (이것은 포인터가 아닌 정수형입니다).

두 용액 :

  1. int **multi 선언 및 int *으로 multi 유지 실제 int **
  2. 전달하고

용액 1 어드레싱 단일 인덱스를 사용 int * 배열을 할당 한 다음배열을 가리키는 경우에만 작동합니다. C에서 다차원 배열 (예 : int myarray[23][78])을 선언하면 이 작동하지 않습니다. C에서 선언 된 다차원 배열은 연속적인 메모리에 보관되며 포인터에 포인터로 함수에 전달하면이 정보가 손실됩니다.

두 번째 해결 방법은 행 메이저 또는 열 메이저 인덱싱 중 하나를 선택하고 관련 크기로 패스를 선택하는 것입니다. 어쨌든이 작업을 수행해야합니다.만약 행 주요 색인 (행을 메모리에 인접)을 선택한 경우, 열 주요 색인 (열은 메모리의 연속이다)를 선택하면, m × n의 매트릭스 multi 동일한 매트릭스이다

multi[i + M*j] 

해결되었으며

multi[N*i + j] 

이 솔루션 으로 해결 것이다 C에서 정적으로 선언 된 다차원 배열에 대한 작업, 당신은 동적으로 최소한의 오버 헤드 C에서 다차원 배열을 할당 할 수 있습니다.

또한 C에서 정적으로 선언 된 다차원 배열은 mat[i][j]으로 액세스 할 때 열 - 주 인덱싱을 사용한다는 점에 유의하십시오. 그러나 중요한 매트릭스 작업을 수행하는 경우 행 - 주요 색인화를 선호하는 좋은 이유가 있습니다. 마지막으로, Fortran은 행 주요 인덱싱을 사용하며, 코드가 Fortran과 인터페이스해야하는 경우 (숫자 코드처럼 사용하는 경우가 많음) 행 우선 인덱싱을 선호해야합니다.

관련 문제