2016-06-06 7 views
-5

것은 내가 특별히 포인터를 사용하여 매트릭스를 만드는 방법에 C 일하고, 나를 혼란 한 가지 말 2 차원 배열에 matrix[i][j]이이 요소에 위치하고 있음을 뜻C에서 2D 배열 (행렬) 할당?

*(*(matrix+i)+j) 

같다고이다 , 위치 [3][3]*(*(0+3)+3))?

보다 구체적으로, I는 다음과 같은 코드를 사용하여 C의 코딩 매트릭스있어 : 그래서

double** makeMatrix(unsigned int rows, unsigned int cols) 
{ 
    unsigned int i; 
    double** matrix; 
    matrix = (double**) malloc(rows * sizeof(double *)); 
    if (!matrix) { return NULL; }/* failed */ 
    for (i = 0; i < rows; i++) 
    { 
     matrix[i] = (double *) malloc(cols*sizeof(double)); 
     if (!matrix[i]) 
     return NULL; 
    } 
return matrix; 
} 

을 어레이 내의 요소 i 번째 각각에 메모리를 할당 - 이것은 우리 얻을 이유 각 요소가 자체 메모리 블록을 가지고 있기 때문에 [i] [j]에 대해 ( (matrix + i) + j)

+1

질문을 게시하기 전에 사이트를 검색하십시오. http://stackoverflow.com/search?q=%5Bc%5D+2d+matrices – Boiethios

+0

거만한 말투로 파열하기 전에 나는 사이트에서 '질문을 찾았고, 내가 무엇을 요구하고 있는지 구체적으로 일치하지 않는다. . – AinJalut

+0

질문하시는 내용을 명확하게 설명하십시오 (예 : 배열이 어떻게 정의되어 있습니까?). 귀하의 게시물은 조금 엉망이며, 지금은별로 유용하지 않습니다. 이 페이지에서 여기에 사용 된 마크 업에 대한 소개를 참조하십시오. http://stackoverflow.com/editing-help – moooeeeep

답변

1

C에서는 LISP, C# 또는 C++/CLI와 같이 "참"감각에 대한 다차원 배열이 없습니다. 그보다 선언 할 수있는 것은 배열 배열 (또는 각 포인터가 malloc 등으로 할당 된 포인터 배열)입니다. 예를 들어 :

int matrix[2][3]; 

각 요소가 세 종류의 int 어레이의 두 개의 요소의 배열을 정의한다.

: 동의어로서

int value = matrix[2][3]; 

: 사용자가 궁극적 배열 요소를 참조 할 때 지금

, 당신은 int 목적으로 다음 그 내부 배열 derefence 필요
int value = (*(*(matrix + 2) + 3)); 
+0

많은 의미가 있습니다. 정말 고마워요. – AinJalut

+0

당신이 작성한 다차원 배열 (선형 주소 공간을 가진 컴퓨터에서와 똑같은)은 OP가 묻는 것과 같지 않습니다 (배열에 대한 포인터 배열 또는 들쭉날쭉 한 배열에 대한 포인터). – user694733

+0

@ user694733 : 네, 알고 있습니다 만 일반적인 아이디어는 같고 배열 배열은 설명하기가 간단합니다. –

1

a[i]*(a + i)에 대해 syntactic sugar입니다. 즉 a[3][3]*(*(a + 3) + 3)과 같습니다.

3[a]*(a + 3)*(3 + a)과 동일하며 a[3]입니다.

+0

배열이 C에서 할당 된 것으로 이해합니다. 첫 번째 요소를 가리키고 i를 추가하여 i 번째 요소를 얻습니다.하지만 이해할 수없는 것은 2D 배열을 가져 오는 것입니다. * (a + i) + * (a + j)가 아닌 이유는 무엇입니까? – AinJalut

+0

@AinJalut : 배열이 포인터가 아닙니다 배열입니다! – Olaf

+0

OP의 코드에 대한 대답은 잘못되었습니다! 동일한 구문은 동일한 의미를 의미하지 않습니다. 이러한 불완전한 착각과 관련된 문제 중 하나는 정확히 동일한 구문을 사용하는 두 가지 매우 다른 것들이 있다는 것입니다. – Olaf