그림 설명 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++의 다단 계 포인터 와 다 차원 배열 의 내용 은 여기까지 입 니 다.본 고의 내용 이 여러분 에 게 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.