그림 설명 c/c++의 다단 계 포인터 와 다 차원 배열

머리말
먼저 상식 을 말씀 드 리 겠 습 니 다.이런 상식 을 이해 하지 못 한다 면 먼저 기초 지식 을 보완 하 세 요.
     1.실제 적 으로 다 차원 배열 이 존재 하지 않 는 다.이른바 다 차원 배열 은 본질 적 으로 1 차원 배열 로 모 의 한 것 이다.
     2.배열 이름 은 상수(할당 작업 을 허용 하지 않 음 을 의미 함)로 배열 의 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소 입 니 다.
     3.배열 과 포인터 의 관 계 는 배열 아래 에 표 시 된 연산 자[]때 문 입 니 다.예 를 들 어 int a[3][2]는*(*(a+3)+2 에 해당 합 니 다.
     4.포인터 는 일종 의 변수 이 고 유형 도 있 습 니 다.메모리 공간 크기 는 시스템 과 관련 이 있 습 니 다.보통 32 비트 시스템 에서 size of(포인터 변수)=4.
     5.지침 은 가감 산술 연산 을 할 수 있 고 가감 의 기본 단 위 는 sizeof(지침 이 가리 키 는 데이터 형식)입 니 다.
     6.배열 의 배열 이름 에 대해 주소(&)작업 을 하고 그 유형 은 전체 배열 형식 입 니 다.
     7.배열 의 배열 이름 에 대해 size of 연산 자 를 조작 하고 그 값 은 전체 배열 의 크기(바이트 단위)입 니 다.
     8.배열 이 함수 형 삼 일 때 포인터 로 퇴화 합 니 다.
 1.1 차원 배열 과 배열 지침
      만약 1 차원 배열 이 다음 과 같다 면:

 char a[3];
      이 배열 은 모두 3 개의 요소 가 있 습 니 다.요소 의 유형 은 char 입 니 다.포인터 가 이 배열 을 가리 키 는 것 을 정의 하려 면 배열 이름 a 를 포인터 변수 에 할당 하려 면 이 포인터 변수의 유형 은 무엇 입 니까?앞에서 말 했 듯 이 한 배열 의 배열 이름 은 첫 번 째 요소 의 첫 번 째 주 소 를 대표 한다.즉,&a[0]에 해당 하고 a[0]의 유형 은 char 이기 때문에&a[0]유형 은 char*이기 때문에 다음 과 같은 지침 변 수 를 정의 할 수 있다. 

 char * p = a;//   char * p = &a[0]
      이상 의 문 자 는 다음 과 같은 메모리 모형 그림 으로 표시 할 수 있 습 니 다.
 
      모두 가 알 아야 할 것 은 a 와&a[0]가 대표 하 는 것 은 모두 배열 의 첫 번 째 요소 의 첫 번 째 주소 입 니 다.만약 에&a 의 값 을 인쇄 하면 이 값 도 배열 의 첫 번 째 요소 의 첫 번 째 주소 와 같 습 니 다.이 곳 의 표현 을 주의 하 십시오.즉,&a 는 수치 적 으로 도 배열 의 첫 번 째 요소 의 첫 번 째 주소 의 값 과 같 지만 그 유형 은 배열 의 첫 번 째 요소 의 첫 번 째 주소 유형 이 아 닙 니 다.즉,char*p=&a 는 잘못된 것 입 니 다.
      앞에서 말 했 듯 이 배열 이름 에 대해 주 소 를 찾 는 작업 을 하 는데 그 유형 은 전체 배열 이기 때문에&a 의 유형 은 char(*)[3]이기 때문에 정확 한 할당 방식 은 다음 과 같다.

 char (*p)[3] = &a;
      주:많은 사람들 이 a+1,&a+1,&a[0]+1,sizeof(a),sizeof(&a)등 과 유사 한 것 에 현혹 되 는데 사실은 지침 의 유형 만 알 면 쉽게 풀 수 있다.예 를 들 어 a+1 과&a+1 의 차 이 를 직면 할 때 a 는 배열 의 첫 번 째 요소 의 첫 번 째 주 소 를 표시 하기 때문에 그 유형 은 char*이기 때문에 a+1 은 배열 의 첫 번 째 주소 값+sizeof(char)에 해당 합 니 다.한편,&a 의 유형 은 char(*)[3]로 전체 배열 을 대표 하기 때문에&a+1 은 배열 의 첫 번 째 주소 값+size of(a)에 해당 합 니 다.(sizeof(a)는 전체 배열 의 크기 를 대표 합 니 다.앞의 7 조 는 설명 하지만 배열 의 크기 가 어떻든 sizeof(&a)는 포인터 변수 가 공간 을 차지 하 는 크기 와 같 습 니 다.구체 적 으로 시스템 플랫폼 과 관련 이 있 습 니 다)
2.2 차원 배열 과 배열 지침
      다음 2 차원 배열 이 있다 면:

 char a[3][2];
      실제 적 으로 다 차원 배열 이 존재 하지 않 기 때문에 a[3][2]를 3 개의 요 소 를 가 진 1 차원 배열 로 볼 수 있다.다만 이 세 가지 요 소 는 각각 1 차원 배열 이다.실제로 메모리 에서 이 배열 은 1 차원 배열 의 형식 으로 저장 되 었 다.저장 순 서 는(낮은 주 소 는 앞 에 있다):a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1](이 방식 은 절대적 인 것 도 아니 고 열 에 따라 우선 저장 하 는 모드 도 있다)
      이해 하기 편리 하도록 저 는 논리 적 인 메모리 그림 을 그 렸 습 니 다.논리 적 인 이 유 는 이 그림 이 이해 하기 쉬 울 뿐 배열 이 메모리 에 있 는 실제 저장 모델(실제 모델 은 앞에서 말 한 것)이 아니 기 때 문 입 니 다.
    
      위의 그림 에서 보 듯 이 우 리 는 배열 을 두 차원 으로 나 눌 수 있다.먼저 1 차원 이 고 a[3][2]를 세 가지 요 소 를 가 진 1 차원 배열 로 볼 수 있다.요 소 는 각각 a[0],a[1],a[2]이다.그 중에서 a[0],a[1],a[2]는 두 가지 요 소 를 가 진 1 차원 배열(요소 유형 은 char)이다.두 번 째 차원 에서 볼 때 여 기 는 a[0],a[1],a[2]를 자신 이 대표 하 는'2 차원'배열 의 배열 이름 으로 볼 수 있다.a[0]를 예 로 들 면 a[0](배열 명)가 대표 하 는 1 차원 배열 은 두 개의 char 유형 요 소 를 가 진 배열 이 고 a[0]는 이 배열 의 배열 이름(배열 의 첫 번 째 요소 의 첫 번 째 주소)이기 때문에 a[0]유형 은 char*이 고 같은 이치 로 a[1]와 a[2]유형 은 모두 char*이다.한편,a 는 1 차원 배열 의 배열 이름 으로 첫 번 째 요소 의 첫 번 째 주 소 를 대표 하고 첫 번 째 요 소 는 두 개의 char 유형 요 소 를 가 진 1 차원 배열 이기 때문에 a 는 두 개의 char 유형 요 소 를 가 진 배열 지침,즉 char(*)[2]를 가리킨다.
     즉,다음 과 같은 할당 이 정확 하 다 는 것 이다.

 char (*p)[2] = a;//a          ,   char (*)[2]

 char * p = a[0];//a[0]          ,   char *
      마찬가지 로 a 주소 추출 작업 은 전체 배열 의 첫 번 째 주 소 를 대표 합 니 다.유형 은 배열 형식(잠시 이렇게 부 르 는 것 을 허락 해 주 십시오),즉 char(*)[3][2]이기 때문에 다음 과 같은 할당 이 정확 합 니 다. 

 char (*p)[3][2] = &a;
3.3 차원 배열 과 배열 지침
     3 차원 배열 이 있다 고 가정 합 니 다.

 char a[3][2][2];
     마찬가지 로 이해 하기 편리 하도록 다음 과 같은 논리 메모리 그림 을 그 렸 다.분석 방법 은 2 차원 배열 과 유사 하 다.먼저,1 차원 측면 에서 볼 때 a[3][2][2][2]는 세 가지 요소 a[0],a[1],a[2]를 가 진 1 차원 배열 이다.다만 이 세 가지 요 소 는 각각'2 차원'배열 일 뿐이다.a 는 1 차원 배열 의 배열 이름 으로 여러 조 의 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소,즉 2 차원 배열 을 가리 키 는 배열 지침 이다.그 유형 은 char(*)[2][2]이다.2 차원 측면 에서 볼 때 과거 에 a[0],a[1],a[2]는 각각 2 차원 배열 의 배열 이름 으로 2 차원 배열 의 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소,즉 1 차원 배열 을 가리 키 는 배열 지침 으로 유형 은 char(*)[2]였 다.마찬가지 로 3 차원 측면 에서 볼 때 과거 에 a[0][0],a[0][1],a[1][1],a[2][0],a[2][1]는 각각 3 차원 배열 의 배열 이름 으로 3 차원 배열 의 첫 번 째 요 소 를 대표 하 는 첫 번 째 주소,즉 char 유형 을 가리 키 는 지침 이 고 유형 은 char*이다.

            위 에서 알 수 있 듯 이 아래 의 할당 은 정확 하 다.

  char (*p)[3][2][2] = &a;//              
  char (*p)[2][2] = a;
  char (*p) [2] = a[0];//  a[1]、a[2]
  char *p = a[0][0];//  a[0][1]、a[1][0]...
4:다단 계 포인터
      다단 계 지침 이란 지침 을 가리 키 는 지침 이다.예 를 들 어:

  char *p = "my name is chenyang.";

  char **pp = &p;//    

  char ***ppp = &pp;//    
      상기 문장 이 모두 함수 체 내 에 있다 고 가정 하면 아래 의 간략화 도 를 사용 하여 다단 계 지침 간 의 지향 관 계 를 표현 할 수 있다.
     
         다단 계 지침 은 보통 함수 의 형 삼 으로 사용 된다.예 를 들 어 흔히 볼 수 있 는 main 함수 설명 은 다음 과 같다.

 int main(int argc,char ** argv)
         배열 이 함수 의 형 삼 으로 사 용 될 때 포인터 로 퇴화 되 기 때문에 위의 형식 은 아래 와 같다.

 int mian(int argc,char* argv[]) 
         argv 는 사용자 가 입력 한 명령 인 자 를 받 는 데 사 용 됩 니 다.이 인 자 는 문자열 배열 로 전 송 됩 니 다.다음 과 같 습 니 다.

 char * parm[] = {"parm1","parm2","parm3","parm4"};//         

 main(sizeof(parm)/sizeof(char *),parm);//    main  ,   main           (glibc         _start)
         다단 계 포인터 의 또 다른 일반적인 용법 은 사용자 가 한 함수 로 메모 리 를 분배 하고 싶다 고 가정 하면 분 배 된 메모리 주 소 는 두 가지 방식 으로 얻 을 수 있다.첫 번 째 는 함수 의 반환 값 이다.이 방식 의 함수 설명 은 다음 과 같다.

 void * get_memery(int size)
 {
  void *p = malloc(size);
  return p;
  }
        두 번 째 주 소 를 얻 는 방법 은 2 급 지침 을 사용 하 는 것 입 니 다.코드 는 다음 과 같 습 니 다.

 int get_memery(int** buf,int size)
 { 
  *buf = (int *)malloc(size);
  if(*buf == NULL)
   return -1;
  else
   return 0;
 }
  int *p = NULL;
  get_memery(&p,10);
총결산
다단 계 지침 에 대한 용법 이 매우 많은 데 특히 2 급 지침 으로 가장 광범 위 하 게 응용 되 고 후속 적 인 시간 이 있 으 면 다시 보충 합 니 다.c/c++의 다단 계 포인터 와 다 차원 배열 의 내용 은 여기까지 입 니 다.본 고의 내용 이 여러분 에 게 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기