컴퓨터공부용 2023. 2. 13. 22:50

Q. 포인터 이해를 위한 문제

여러분은 택배기사입니다. 여러분이 배송해야 할 택배를 받는 사람은 A학생입니다.

여러분은 A학생이 어디있는지 모르는데 A학생에게 택배를 배송하기 위해서는 어떻게 해야 할까요?


A학생에게 택배를 배송하기 위해서는 A학생의 집 주소로 택배를 배송하면 된다.

이것을 C언어에 적용하면, A학생은 변수 이름, 택배는 데이터, 그럼 주소는?

주소에 해당하는 것은 메모리 주소이다. 우리는 이 메모리 주소를 저장하기 위해 포인터 변수를 사용한다.

 

조금 헷갈릴 수 있겠지만, int는 정수형, char는 문자형처럼 포인터를 하나의 타입이라 생각하면 된다.

포인터는 조금 특별하게 전용 연산자가 존재한다. * 연산자와 & 연산자이다.

예제로 알아보자.

 

#include <stdio.h>

int main()
{
    int a = 5;
    
    printf("변수 a의 값 : %d\n", a);
    printf("변수 a의 주소 : %d\n", &a);

    return 0;
}
실행 결과
변수 a의 값 : 5
변수 a의 주소 : 1436276836

즉, & 연산자는 변수의 메모리 주소를 나타낼 때 사용하는 연산자이다.

#include <stdio.h>

int main()
{
    int a = 5;
    int *b = &a;
    
    printf("변수 a의 값 : %d\n", a);
    printf("변수 a의 주소 : %u\n", &a);
    printf("변수 b의 값 : %u\n", b);
    printf("변수 b가 가리키는 곳의 값 : %d\n", *b);

    return 0;
}
실행 결과
변수 a의 값 : 5
변수 a의 주소 : 1436276836
변수 b의 값 : 1436276836
변수 b가 가리키는 곳의 값 : 5

변수 선언 시에 * 연산자를 사용하면, 해당 변수는 주소를 저장하는 포인터 변수가 된다.

변수 사용 시에 * 를 사용하게 되면 포인터 변수가 가진 주소에 저장된 값을 사용하게 된다.

즉, 변수 b가 가진 값인 a의 주소, a의 주소에 저장된 값인 5를 불러오게 된다.

 

다음에는 포인터를 활용하는 방법과 포인터를 사용할 때 주의할 점을 알아볼 것이다.