C 언어 배열 포인터 상세 해석 및 예제 코드

배열(Array)은 같은 유형의 데 이 터 를 가 진 일련의 집합 으로 모든 데 이 터 를 하나의 배열 요소(Element)라 고 부른다.배열 의 모든 요 소 는 메모리 에서 연속 으로 배열 되 어 있 으 며,전체 배열 이 사용 하 는 것 은 메모리 입 니 다.int arr[]={99,15,100,888,252};예 를 들 어 이 배열 의 메모리 분 포 는 다음 그림 과 같다.

배열 을 정의 할 때 배열 이름과 배열 의 길 이 를 알려 야 합 니 다.배열 이름 은 하나의 지침 이 라 고 볼 수 있 습 니 다.배열 의 0 번 째 요 소 를 가리 키 고 있 습 니 다.C 언어 에서 우 리 는 0 번 째 요소 의 주 소 를 배열 의 첫 번 째 주소 라 고 부 릅 니 다.위의 배열 을 예 로 들 면 아래 그림 은 arr 의 지향 입 니 다.

다음 예 는 배열 요 소 를 포인터 로 옮 겨 다 니 는 방법 을 보 여 줍 니 다.

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int len = sizeof(arr) / sizeof(int); //     
 int i;
 for(i=0; i<len; i++){
  printf("%d ", *(arr+i) ); //*(arr+i)   arr[i]
 }
 printf("
"); return 0; }
실행 결과:
99  15  100  888  252
네 번 째 줄 코드 는 배열 의 길 이 를 구 하 는 데 사 용 됩 니 다.sizeof(arr)는 전체 배열 이 차지 하 는 바이트 수 를 얻 을 수 있 습 니 다.sizeof(int)는 배열 요소 가 차지 하 는 바이트 수 를 얻 을 수 있 습 니 다.이 를 제외 한 결 과 는 배열 에 포 함 된 요소 개수,즉 배열 길이 입 니 다.
8 줄 코드 에서 우 리 는*(arr+i)라 는 표현 식 을 사 용 했 습 니 다.arr 는 배열 이름 으로 배열 의 0 번 째 요 소 를 가리 키 며 배열 의 첫 번 째 주 소 를 표시 합 니 다.arr+i 는 배열 의 두 번 째 요 소 를 가리 키 고*(arr+i)는 두 번 째 요소 의 데 이 터 를 가리 키 며 arr[i]와 같 습 니 다.
arr 는 int*형식의 지침 으로 1 을 추가 할 때마다 자신의 값 은 size of(int)를 증가 시 키 고 i 를 추가 할 때 자신의 값 은 size of(int)*i 를 증가 시 킵 니 다.이것 은 에서 상세 하 게 설명 되 었 습 니 다.
우 리 는 또한 배열 을 가리 키 는 지침 을 정의 할 수 있다.예 를 들 어:
int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;
arr 자체 가 지침 이 므 로 지침 변수 p 에 직접 값 을 부여 할 수 있 습 니 다.arr 는 배열 의 0 번 째 요소 의 주소 이기 때문에 int*p=arr;int*p=&arr[0];즉,arr,p,&arr[0]이라는 세 가지 문법 은 모두 등가 이다.그들 은 모두 수조 의 0 번 째 요 소 를 가리 키 거나 수조 의 시작 을 가리킨다.
만약 포인터 가 배열 을 가리킨다 면,우 리 는 그것 을 배열 포인터(Array Pointer)라 고 부른다.
주의해 야 할 것 은 배열 자체 에 유형 이 없고 배열 요소 만 유형 이 있 습 니 다.p 가 가리 키 는 배열 요 소 는 int 형식 이기 때문에 p 의 유형 도 int*여야 합 니 다.
반대로 p 는 하나의 배열 을 가리 키 는 지 모 르 고 p 는 하나의 정수 만 가리 키 며 p 를 어떻게 사용 하 는 지 는 프로그래머 의 인 코딩 에 달 려 있다.
위의 코드 를 변경 하고 배열 포인터 로 배열 요 소 를 옮 겨 다 닙 니 다:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *(p+i) );
 }
 printf("
"); return 0; }
배열 은 메모리 에 배열 요소 의 간단 한 배열 일 뿐 시작 과 끝 표지 가 없습니다.배열 의 길 이 를 구 할 때 size of(p)/size of(int)를 사용 할 수 없습니다.p 는 int 형식 을 가리 키 는 지침 일 뿐 컴 파일 러 는 그것 이 가리 키 는 정수 인지 일련의 정수(배열)인지 모 릅 니 다.그래서 sizeof(p)는 p 라 는 포인터 변수 자체 가 차지 하 는 바이트 수 를 구 합 니 다.전체 배열 이 차지 하 는 바이트 수가 아 닙 니 다.
배열 지침 에 따라 전체 배열 요소 의 개 수 를 역 출시 할 수 없 으 며,배열 이 어디서부터 시작 해 야 하 는 지,어디서부터 끝 나 는 지 등의 정 보 를 담 을 수 없다 는 것 이다.
지난 절 에 우 리 는 지침 변 수 를 덧셈 과 뺄셈 연산 을 할 때 데이터 형식의 길이 에 따라 계산한다 고 말 했다.포인터 변수 p 가 배열 의 시작 을 가리 키 면 p+i 는 배열 의 i 번 째 요 소 를 가리 킵 니 다.p 가 배열 의 n 번 째 요 소 를 가리 키 면 p+i 는 n 번 째 요 소 를 가리 키 는 것 입 니 다.한편,p 가 배열 의 몇 번 째 요 소 를 가리 키 든 p+1 은 항상 다음 요 소 를 가리 키 고 p-1 도 항상 이전 요 소 를 가리킨다.
위의 코드 를 변경 하여 p 가 배열 의 두 번 째 요 소 를 가리 키 도록 합 니 다:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int *p = &arr[2]; //      int *p = arr + 2;
 printf("%d, %d, %d, %d, %d
", *(p-2), *(p-1), *p, *(p+1), *(p+2) ); return 0; }
실행 결과:
99, 15, 100, 888, 252
배열 지침 을 도입 한 후에 우 리 는 두 가지 방안 으로 배열 요 소 를 방문 했다.하 나 는 아래 표 시 를 사용 하고 다른 하 나 는 지침 을 사용 하 는 것 이다.
1)아래 표 시 를 사용한다
배열 요 소 를 arr[i]형식 으로 접근 하 는 것 이다.p 가 배열 arr 를 가리 키 는 지침 이 라면 p[i]를 사용 하여 배열 요 소 를 방문 할 수 있 습 니 다.이것 은 arr[i]와 같 습 니 다.
2)포인터 사용
즉,*(p+i)형식 으로 배열 요 소 를 방문 하 는 것 입 니 다.또한 배열 이름 자체 도 포인터 이 고*(arr+i)를 사용 하여 배열 요 소 를 방문 할 수 있 습 니 다.이것 은*(p+i)와 같 습 니 다.
배열 이름 이 든 배열 지침 이 든 위의 두 가지 방식 으로 배열 요 소 를 방문 할 수 있다.다른 것 은 배열 이름 은 상수 이 고 값 은 바 꿀 수 없 으 며 배열 지침 은 변수 입 니 다.(상수 라 고 특별히 가리 키 지 않 는 한)값 은 임의로 바 꿀 수 있 습 니 다.즉,배열 이름 은 배열 의 시작 만 가리 킬 수 있 고 배열 지침 은 배열 의 시작 을 가리 키 고 다른 요 소 를 가리 킬 수 있다.
위의 코드 를 변경 하고 셀 프 연산 자 를 통 해 배열 요 소 를 옮 겨 다 닙 니 다:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *p++ );
 }
 printf("
"); return 0; }
실행 결과:
99  15  100  888  252
8 번 째 줄 코드 에서*p++는*(p++)로 이해 해 야 합 니 다.순환 할 때마다 p 의 값(p++p 자체 의 값 을 증가 시 킵 니 다)을 바 꾸 어 p 가 다음 배열 요 소 를 가리 키 도록 해 야 합 니 다.이 문 구 는*arr++라 고 쓸 수 없습니다.arr 는 상수 이 고 arr+는 값 을 바 꿀 수 있 습 니 다.이것 은 잘못된 것 입 니 다.
배열 포인터 에 대한 수수께끼
p 가 배열 arr 의 n 번 째 요 소 를 가리 키 는 지침 이 라 고 가정 하면*p++,*+p,(*p)++는 각각 무슨 뜻 입 니까?
*p++는*(p++)와 같 습 니 다.먼저 n 번 째 요소 의 값 을 얻 은 다음 에 p 를 다음 요 소 를 가리 키 고 위 에서 상세 하 게 설명 하 였 습 니 다.
*+p 는*(+p)와 같 습 니 다.+p 연산 을 먼저 진행 하여 p 의 값 을 증가 시 키 고 다음 요 소 를 가리 키 며 전체적으로*(p+1)에 해당 하기 때문에 n+1 개의 배열 요소 의 값 을 얻 을 수 있 습 니 다.
(*p)++는 매우 간단 합 니 다.먼저 n 번 째 요소 의 값 을 얻 은 다음 에 이 요소 의 값 에 1 을 추가 합 니 다.가설 p 지향 0  개 요소,그리고 0 번 째 요소 의 값 은 99 입 니 다.이 문 구 를 실행 한 후 0 번 째 입 니 다.  개 원소 의 값 이 100 으로 변 합 니 다.
이상 은 C 언어 배열 지침 에 대한 자 료 를 정리 하고 관련 지식 을 계속 보충 하 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기