2021-06-04 · 2

포인터

ctil

이 글은 작성된 지 2년이 넘었어요. 내용이 오래됐을 수 있어요.

c, c++ 포인터


포인터란?

 특정 메모리의 위치를 가리키도록 하는 변수를 포인터(pointer)라고 합니다. 즉 주소를 알아야 사용할 수 있습니다.

우리는 지금까지 변수를 선언하면 그 변수가 메모리에 기록된다고 생각하지 않고, 그 선언한 이름과 값만 생각을 하고 사용을 했습니다. 하지만 실제로 int a; 이라고 선언할 때 '메모리 x132453647(임의)에 int형, 변수 이름 a, 초기화되지 않은 상태로 사용한다'라고 하는 것과 같습니다. 이때 a = 10; 이라고 입력하면 '메모리 x132453647에 있는 값을 10으로 바꿔주는 것'과 같습니다.

 그래서 우리가 포인터를 사용한다는 것은 '이름이 a'인 변수를 찾는 것이 아닌, '메모리 x132453647(임의)'를 찾으라는 것입니다. 주소도 알게 되면 당연히 값도 알 수 있을 겁니다.

포인터 선언!

포인터 또한 기존에 변수를 선언 하던 것과 매우 유사 하게 생겼습니다. 자료형 또한 int, float, double, lang, char 등 존재합니다. 변수와 동일하게 선언하되 중간에 * 만 넣어주시면 됩니다.

예를 들면

//int형 포인터
int *a;

//float형 포인터
float *a;

//double형 포인터
double *a;

위와 같이 선언할 수 있다.

포인터 선언과 초기화 어떻게 하면 선언과 함께 초기화를 할 수 있을까요? 우리가 "scanf"를 배울때 "&"이런 기호를 사용한 기억이 있나요? 바로 "&"이 기호가 주소를 알려주는 기호입니다.

예를 들면

#include <stdio.h>

int main() {
    int num1 = 5;
    int num2 = 10;
    int *num1Ptr = &num1;
    int *num2Ptr = &num2;

    printf("%d %d\n", num1, *num1Ptr);
    printf("%d %d\n", num1, num1Ptr);
}

/*
출력 : 5  5
      10 10
*/

위와 같이 할 수 있다. 조금 설명하자면 int형 변수 num1, num2를 선언후 int형 포인터 num1Ptr, num2Ptr도 선언하여 

int* num1Pointer = &num1;

int * num1Pointer = &num2;

를 입력해주니, 각각 num1과 num2의 주소를 받는 것을 확인할 수 있습니다. 그 결과 num1값과 *num1Ptr의 값이 동일하게 출력되는 것을 확인할 수 있습니다.

주의!

인트형 포인터 int* p 를 선언했을 때 p = &num1 int형 포인터인 변수 p의 값에 num1변수 값을 대입했을때,

printf("%d", *p) 와 같은 식으로 p에 *을 붙여서 사용하면 p가 가리키는 주소에 있는 값을 나타내고

printf("%d", p)와 같이 p만 사용하면 p가 가리키고 있는 주소를 나타냅니다.


원문: tistory — 2021-06-04 발행, 이 블로그로 이전됨.

댓글

댓글을 삭제할까요?

관련 글

포인터 · 나봄하랑