[C] 포인터, C 포인터, C Pointer, 포인터 활용하기 - 1

728x90
반응형

C언어를 접해본 사람이라면 누구나 한 번쯤은 들어봤을 거다.

"포인터는 C언어의 '꽃'이다"

"포인터를 이해하면 C는 다 한 거다."

틀린 말은 아니다. C언어에서 가장 많이 사용하는 것이 포인터고, 가장 어렵다고 말할 수 있는 것도 포인터다. 이번 포스팅에서 다룰 단일 포인터는 그나마 이해하기 쉽지만 이중 포인터, 포인터와 구조체 등 포인터를 응용하기 시작하면 머리가 많이 아플 것이다. 우선 포인터가 뭔지 알아보자.

 

Pointer? 

"포인터는 다른 변수의 주소를 가리키기는 또 다른 변수다"라고 위키백과에 정의되어 있다. 우리가 흔히 포인터 변수라고 말하는 것은 다른 변수의 메모리 영역(변수의 주소)을 가리키는 변수를 말한다. 

 

https://ko.wikipedia.org/wiki/%ED%8F%AC%EC%9D%B8%ED%84%B0_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 

 

포인터 (프로그래밍) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조

ko.wikipedia.org

 

메모리 영역 가리킨다? 간단한 코드로 이해를 해보자.

#include <stdio.h>

int main(void)
{
    int *a=NULL;
    int b = 10;

    printf("%d\n", a);
    
    a = &b;

    printf("%d\n", a);
    printf("%d\n", *a);
    return 1;
}

 int형 변수 a앞에 *이 붙어 선언되어 있다. 포인터 변수를 선언하는 방법이다. 변수 앞에 붙여도 되고, 자료형 뒤에 붙여도 된다. 어디에 붙여도 상관없다. 포인터 변수로 선언하고 NULL(비어 있다는 의미다)으로 초기화시켰다. 바로 아래 int형 변수 b가 선언되어 있고 10으로 초기화되어 있다. 

첫 번째 printf문을 보자. 일반적으로 알고 있는 int형 변수 출력방식으로 출력했다. 결과는 0이 나올 것이다. 바로 아래줄을 보면 다음과 같은 코드가 있다.

a = &b;

이제부터 a는 포인터의 역할을 한다. 이 코드의 의미는 "포인터 변수 a는 int형 변수 b의 주소 번지를 가리킨다"라는 의미다.  두 번째 printf의 포인터 변수 a 출력 값을 보면 뭔가 이상한? 값이 출력될 것이다. 컴파일을 할 때마다 값이 변경될 것이고, 컴퓨터 사양마다 다르게 출력될 것이다. 포인터 변수 a는 int형 변수 b의 주소 번지를 가리키고 있기 때문에 b의 주소 번지를 출력한 것이다. 세 번째 printf문의 출력 값을 보면 b가 가지고 있는 값 10이 출력된다. 포인터 변수는 가리키는 주소 번지에 저장되어 있는 값을 가져올 수 있다.  값을 가져올 수 있으면 변경하는 것도 되겠지? 코드를 정리해서 다시 살펴보자.

#include <stdio.h>

int main(void)
{
    int b = 10;
    int* a = &b;

    *a = 20;

    printf("%d\n", *a);
    printf("%d\n", b);

    printf("%x\n", a);
    printf("%x\n", a+1);
}

int형 변수 b를 선언하고 10으로 초기화시켰다. int형 포인터 변수 a를 선언하고 b의 주소 번지를 가리키게 했다. 이 상태에서 a를 20으로 변경해 보자. 출력은 아래와 같을 것이다.

20
20
a7f7fa24
a7f7fa28

포인터 변수가 가리키고 있는 주소 번지의 값을 변경할 수 있다. 포인터 변수를 통해서 포인터 변수가 가리키는 주소 번지의 값을 변경하는 것을 "간접 접근 방식"이라고 하고, 우리가 일반적으로 사용하는 변수를 직접 연산하는 방법을 "직접 접근 방식"이라고 한다.

13, 14 번째 줄은 포인터 변수가 가리키는 주소값을 확인하는 코드다. 포인터 변수에 *을 사용하지 않고 변수 이름만 사용하면 해당 포인터가 가리키는 주소값을 사용할 수 있다. 

위 내용을 그림으로 그려보고 정리하면,

- int형 변수 a는 10의 값을 갖고 0x1000번지에 위치한 int형 변수 b를 가리킨다.

- 포인터 변수 a를 통해 변수 b의 값을 가져오거나 바꿀 수 있다.

- 포인터 변수에 *을 사용하지 않으면 포인터 변수는 가리키는 영역의 주소 값을 출력한다. 

- 포인터 변수에 *을 사용하면 가리키는 주소 번지에 할당된 변수의 값을 가져오거나 바꿀 수 있다.

 

잘 설명한 건지 모르겠다. 다음 포스팅은 다중포인터와 여기서 설명하지 못한 내용을 조금 더 다뤄봐야겠다.

 

- 끝 -

728x90
반응형