CS 기초/메모리

[CS50] 포인터

담크 2021. 8. 19. 23:59

지난 포스팅에서 메모리 주소를 설명하면서 '&'연산자와 '*'연산자를 사용할 때 포인터라는 개념이 나왔는데 오늘은 이 포인터에 대해 공부해보도록 하겠습니다.

 

다시 한번 설명하자면 '*'연산자는 어떤 메모리 주소에 있는 실제값을 받아오게 해주는 기능을 합니다. 이 연산자를 이용해서 아래와 같이 포인터 역할을 하는 변수 선언도 가능합니다.

#include<stdio.h>

int main(void)
{
	int n = 50;
    int *p = &n;
    printf("%p\n", p);
    printf("%i\n", *p);
}

결과는 어떻게 나올까요? 

위 코드를 보면 int형 변수 n에는 50이라는 값이 저장되어있습니다.

그리고 *p라는 포인터 변수에 &n이라는 변수 n의 주소를 저장합니다. 그래서 int *p는 *이 이 변수가 포인터라는 것을 알려주는 것이고 int는 이 포인터가 int타입이라는 것을 의미합니다.

따라서 첫번째 printf문의 결과로 p의 값인 n의 주소 값이 나온 것이고, 두 번째 printf의 결과로 포인터의 실제값인 변수의 값 50을 출력하게 되는 것입니다.

그래서 실제로는 메모리에

그림과 같은 형태로 저장되어있지만 이게 복잡하다고 생각된다면 추상적으로 

이 그림처럼 단지 p가 n을 가리키고 있다는 것만 생각해도 괜찮습니다. 왜냐하면 보통은 주소보단 값을 궁금해하기때문에 n에 접근만 잘 하면 됩니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 메모리' 카테고리의 다른 글

[CS50] 메모리 교환, 스택, 힙  (0) 2021.08.24
[CS50] 문자열 복사  (0) 2021.08.22
[CS50] 문자열 비교  (0) 2021.08.21
[CS50] 문자열  (0) 2021.08.20
[CS50] 메모리 주소  (0) 2021.08.18