코드 여행자
배열과 포인터(Array and Pointer) 본문
배열과 포인터
아래와 같이 배열에 정수값들이 저장되어 있습니다.
포인터 변수의 자료형과 배열의 자료형이 동일하면 포인터 변수는 배열의 주소를 가리킬 수 있습니다.
코드 1
#include<stdio.h> int main() { int arr[] = {1,3,5}; int *p; printf("&arr[0] = %p\n",&arr[0]); // 1) printf("&arr[1] = %p\n",&arr[1]); // 2) printf("&arr[2] = %p\n",&arr[2]); // 3) printf("arr = %p\n",arr); // 4) 중요! printf("&arr = %p\n",&arr); // 5) p = arr; // 6) p = &arr, p = &arr[0] 모두 동일 printf("&p = %p\n",&p); // 7) printf("p = %p\n",p); // 8) return 0; }
결과
&arr[0] = 0x7ffee76fbb2c &arr[1] = 0x7ffee76fbb30 &arr[2] = 0x7ffee76fbb34 arr = 0x7ffee76fbb2c &arr = 0x7ffee76fbb2c &p = 0x7ffee76fbb20 p = 0x7ffee76fbb2c |
arr라는 정수형 배열을 선언하면서 1,3,5 값을 저장하였습니다.
따라서 arr 배열의 길이는 3입니다.
1) ~ 3) 배열의 첫번째, 두번째, 세번째 요소의 주소를 출력하였습니다. 0x7ffee76fbb2c 부터 0x7ffee76fbb37 까지 할당 되었습니다.(정수형은 4바이트이므로)
4) 이부분은 중요합니다.
배열의 이름은 주소입니다. arr를 출력했는데 arr[0]의 주소와 동일한 주소값을 출력하였습니다.
5) arr와 동일하게 &arr도 같은 주소값을 나타냅니다.
6) p 포인터 변수에 arr라는 배열의 주소값을 대입합니다. 이제 p 변수를 이용해서 배열에 접근할 수 있습니다.
7) 변수 p가 메모리의 어느 주소에 위치하는지 확인해 보았습니다.
8) 6) 코드에 의해서 p 포인터 변수는 arr의 주소값을 받았기 때문에 arr의 시작 주소값을 출력합니다.
포인터 변수로 배열의 요소 접근
위의 예제에 이어서 포인터 변수를 이용하여 배열의 요소를 접근하는 방법을 살펴 보도록 하겠습니다.
코드 2
#include<stdio.h> int main() { // 코드 1 내용 이어서.. printf("p = %p\n",p); // 1) printf("*p = %d\n",*p); // 2) printf("p+1 = %p\n",p+1); // 3) 중요! printf("*(p+1) = %d\n",*(p+1)); // 4) printf("p+2 = %p\n",p+2); // 5) printf("*(p+2) = %d\n",*(p+2)); // 6) return 0; }
결과
p = 0x7ffee326fb2c
*p = 1
p+1 = 0x7ffee326fb30
*(p+1) = 3
p+2 = 0x7ffee326fb34
*(p+2) = 5 |
포인터 변수를 선언할 때 아래와 같이 자료형을 먼저 표시해 줍니다.
int * a;
char *b;
long *;
이것은 포인터 변수가 가리키는 주소에서 몇 바이트를 읽을지를 결정하는 중요한 부분입니다.
정수형은 4바이트를 읽어야 정상적으로 값을 읽은 것이고, char 형은 1 바이트를 읽어야 합니다.
1) p 변수는 arr 배열을 가리키고 있습니다.
따라서 p 는 배열의 0번째 요소의 주소값을 의미합니다.
2) *p는 0번째 요소의 값을 가리킵니다.
3) p+1 는 어떤 동작을 할까요? p는 주소값인데 1을 더한다는 것은 단순히 주소값에 1을 더하는 것이 아닙니다.
p의 자료형의 사이즈 만큼 더하는 것입니다.
p+1 ==> 0x7ffee76fbb2c + 4(정수형 사이즈) == 0x7ffee76fbb30
0x7ffee76fbb30 값은 &arr[1]의 값과 동일합니다.
즉, p+1 은 arr 배열의 1번째 요소값이 저장된 주소를 의미합니다.
4) p+1 은 arr 배열의 1번째 요소값의 주소이므로 *(p+1)는 그 주소에 저장된 값을 역참조(dereference)합니다. 즉, 3 입니다.
5) p+2 를 계산해 보겠습니다.
p+2 ==> 0x7ffee76fbb2c + 2*4(정수형 사이즈) == 0x7ffee76fbb34
0x7ffee76fbb34 값은 &arr[2]의 값과 동일하므로 p+2는 2번째 요소의 주소입니다.
6) 2번째 요소의 값인 5를 출력합니다.
아래 그림은 코드 1과 코드 2를 실행한 후 시스템의 메모리 상태를 나타낸 것입니다.
이번 포스팅에서는 배열과 포인터 변수를 사용하는 방법에 대해서 알아보았습니다.
'포인터(Pointer) 변수' 카테고리의 다른 글
포인터 기본2- call by reference (0) | 2019.11.03 |
---|---|
포인터(Pointer) - 기본1 (0) | 2019.10.20 |