코드 여행자

배열과 포인터(Array and Pointer) 본문

포인터(Pointer) 변수

배열과 포인터(Array and Pointer)

코드여행자12 2019. 11. 11. 00:29

배열과 포인터


아래와 같이 배열에 정수값들이 저장되어 있습니다.

포인터 변수의 자료형과 배열의 자료형이 동일하면 포인터 변수는 배열의 주소를 가리킬 수 있습니다.


코드 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
Comments