포인터 연산

김 무무 ㅣ 2024. 4. 21. 21:27

1. 개요

포인터글에서 여기까지 작성하려고 했는데, 글이 길어지니까 이해하기 어려울 것 같아서 나눠서 작성하게 됐다.

이 글에서는 포인터의 몇 가지 사용방법을 설명하겠다.

 

 

 

2. 포인터 연산

간접 참조 연산자를 사용할 때는 어떤 변수에 *기호를 붙일지 정확하게 지정해야 한다.

그러지 않는다면 의도한 것과 다른 결과가 출력될 수 있다.

 

코드 :

#include <stdio.h>
int main() {
    int a = 50;
    int* ptr = &a;

    printf(" ptr\t\t= %d\n", ptr);             // ptr
    printf(" ptr + 1\t= %d\n", ptr + 1);       // ptr + 1
    printf(" ptr\t\t= %d\n", *ptr);            // *ptr
    printf(" *ptr + 1\t= %d\n", *ptr + 1);     // *ptr + 1
    printf(" *(ptr + 1)\t= %d\n", *(ptr + 1)); // *(ptr + 1)
}

 

실행 결과

 

위와 같은 결과가 나온 이유를 하나씩 알아보자.

 

< ptr >

1) ptr에 저장된 주소(100)를 출력한다.

< ptr + 1 >

2) ptr에 저장된 주소의 다음 주소(104)를 출력한다.

< *ptr >

3) ptr에 저장된 주소를 역참조해 값(50)을 출력한다.

< *ptr + 1 >

4) ptr에 저장된 주소를 역참조해 값(50)을 가져오고, 그 값에 1을 더한다.

< *(ptr + 1) >

5) ptr에 저장된 주소의 다음 주소(104)를 역참조해 값을 가져온다.

 

 

 

 

위 실행 결과 중 이상한 부분은 ptr + 1일 것이다.

왜 ptr(100)에 저장된 다음 주소가 101이 아닌 104일까?

이 내용을 이해하기 위해서는 '메모리 주소의 크기'에 대해 다시 한번 생각해봐야 한다.

 

메모리 주소의 크기는 이미 운영체제에 맞춰 정해져 있다.

32비트 운영체제는 4바이트, 64비트 운영체제는 8바이트의 크기를 갖는다.

1바이트가 8비트라는 것을 알고 있다면 굳이 외울 필요도 없이 이해할 수 있을 것이다.

 

 

그럼 이제 포인터 변수 ptr부터 다시 한번 생각해 보자.

ptr은 4바이트 크기의 메모리 주소를 저장하는 변수다.

그렇기 때문에 ptr은 100번지부터 4바이트를 사용하고, ptr + 1은 ptr에서 사용한 주소의 다음 주소인 104번지부터 4바이트를 읽어오는 것이다.

그리고 *(ptr + 1)은 초기화되지 않은 위치를 읽어오므로 쓰레기값을 출력한다.

 

 

마찬가지로 ptr + 2는 8바이트 뒤인 108번지, ptr + 3은 112번지를 출력한다.

즉, 1씩 더할때마다 자료형만큼 메모리를 더하는 것이다.

 

 

3. 마무리

짧지만 조금 헷갈릴 수 있는 내용이라 따로 분리할 수밖에 없었다.

다음은 드디어 배열에 대해 설명하려고 한다.

그전에 이번 내용을 확실하게 이해하고 넘어가길 바란다.

'생각 정리' 카테고리의 다른 글

레퍼런스 변수와 포인터 변수  (0) 2024.04.29
재귀함수  (0) 2024.04.28
배열  (0) 2024.04.22
포인터  (0) 2024.04.14
메모리  (0) 2024.04.07