2014-11-14 3 views
0

다차원 배열을 처리하는이 프로그램을 방금 보았습니다. 나는 그것의 요지를 가지고 있지만, 확실하지 않은 특별한 표기법이있다.배열에 대한 포인터의 표현은 무엇입니까?

2 차원 배열은 2D 행렬의 행 수를 언급 할 필요가 없기 때문에 다차원 배열의 열에 포인터를 전달하는 것이 좋습니다.

int (*pm)[COLUMN] 여기 전체 프로그램 : 그래서, 2 차원 매트릭스의 컬럼에 대한 포인터 오후 전달

#include<stdio.h> 
#include<stdlib.h> 

const int ROW = 2; 
const int COL=3; 

void fill_array(int (*pm)[COL], int row); 
void display_array(int m[][COL], int row); 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 

    int i,j; 
    int m[ROW][COL]; 

    //CALL function to enter elements 
    fill_array(m,ROW); 

    //display 
    display_array(m,ROW); 
    return 0; 
} 

void fill_array(int (*pm)[COL], int row) 
{ 
    int i,j; 

    printf("Please fill the array's content: \n"); 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<COL;j++) 
     { 
      printf("\n m[%d][%d]: ",i,j); 
      scanf("%d", &pm[i][j]); 
     } 
    } 
} 

void display_array(int m[][COL], int row) 
{ 
    int i,j; 

    printf("\n Array's contents: \n"); 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<COL;j++) 
     { 
      printf("%d\t", m[i][j]); 
     } 

     printf("\n"); 
    } 
} 

내가 배열에 대한 포인터의 표현에 대해 확실하지 않다. 포인터가 배열에 추가되는 표기법에 익숙하지 않다는 의미입니다. 누군가가 이것에 약간의 빛을 던질 수 있습니까?

감사합니다.

+0

'void fill_array (int (* pm) [COL], int row);'void fill_array (int pm [] [COL], int row);와 동일합니다. –

+0

http://stackoverflow.com/questions/1052818/create-a-pointer-to-two-dimensional-array http://stackoverflow.com/questions/3904224/declaring-a-pointer-to-multidimensional-array- and-allocating-the-array – Antonio

답변

-1

저는 아직 C 언어에 익숙하지 않지만 포인터 배열에 대한 포인터라고 생각합니다. 동적 2 차원 배열을 만드는 방법을 알고있는 유일한 방법은 그것과 같습니다.

-1

글쎄, C/C++에서 메모리에 할당 된 연속 된 공간 이상의 배열이 없다는 것이 진짜 진실이라고 말할 수 있다면. 할당 된 메모리 블록의 시작을 가리키는 포인터가 있습니다. 이 경우에 [10] int 엘리먼트의 배열을 가지고 있다면, 할당 된 스페이스는 sizeof (int) * 10이고 포인터는 첫 번째 엘리먼트를 가리킨다. 그렇기 때문에 ++와 decrements를 쉽게 늘릴 수 있습니다.

차원 배열을 사용하면 포인터를 첫 번째 요소로 전달하고 주위를 열로 쉽게 넘길 수 있습니다. 그러나 배열 [2] [3]을 사용하면 단일 포인터로 쉽게 작업 할 수 있습니다. 할당 된 전체 메모리 블록을 캡처하려면 2 * 3을 곱하면됩니다.

+0

당신이 틀렸어도, C/C++은 다중 배열 배열조차도 배열을 가지고 있습니다. –

+0

글쎄, 우리는 표준 배열에 대해 이야기하고 있습니다. 실제로는 매번 공간이 이동됩니다. 때문에 포인터와 배열은 서로 너무 관련이 있습니다. – celeborn

+0

그런데 Jerry Chain 프로그래밍 패러다임 과정을 확인할 수 있습니다. http://see.stanford.edu/errors/default.aspx?aspxerrorpath=/see/courseinfo.aspx – celeborn

1

함수의 인수로 int m[][COL]int (*m)[COL]과 같으며, 마찬가지로 int v[]int *v과 같습니다. 두 경우 모두 m은 크기가 COL 인 정수 배열에 대한 포인터로 처리됩니다.

중요한 비트는 *m (역 참조 m)이 첫 번째 배열을 제공한다는 것입니다 (*v은 해당 벡터의 첫 번째 요소를 제공함). m의 포인터 연산이 예상대로 작동합니다 (예 : *(m+1)은 두 번째 배열을 제공합니다. 결과적으로 함수 내에 2 차원 배열 (m[i][j]) 인 것처럼 m을 인덱싱 할 수 있습니다.

2

배열이 값에 의해 함수에 전달되면 함수는 첫 번째 요소에 대한 포인터로 변환됩니다. 은 C 표준 (6.3.2.1 Lvalues, 배열 및 기능 부호)가 sizeof의 연산자의 연산 또는 단항 & 연산자 또는 초기화하는데 사용하는 문자 스트링 인 경우를 제외

3 따르면 배열 'type of array'형식을 가진 표현식은 배열 개체의 초기 요소를 가리키고 좌변 값이 아닌 유형 ''to pointer ''형식의 표현식으로 변환됩니다. 배열 객체 에 레지스터 저장 클래스가있는 경우 동작은 정의되지 않습니다.

가이 차례로 int[COL] 형의 배열의 첫 번째 요소의 포인터로 변환하는 기능이 배열

int m[ROW][COL]; 

전달하면. 당신이

같은 한 차원 배열에 대한 포인터를 선언하면이 포인터 역 참조하면, 예를 들어 int[COL]

SO 형태의 1 차원 배열을 얻을 것이다 경우이 배열에 대한 포인터

int (*)[COL] 

모양을

int (*pm)[COL] 

다음 표현

*pm 

int[COL]

*pm 유형있다하면 다음 첨자 연산자 번째 pm[0][0] 적용될 수있는 배열이다 pm[0]pm[0]로 동일하며 이차원 ARRA 유형 int의 첫 번째 요소를 얻을 것이다.

관련 문제