C - 포인터 기초

포인터(Pointer)는 주소값을 저장하는 변수이다. 

char var = 'A';

만약  var이라는 변수에 'A'가 저장되어 있다면 var이라는 변수명을 통해 데이터에 접근할 수 있다. 하지만 var 대신 다른 변수에 주소값을 저장하고 사용할 수도 있다. 

주소값은 이해를 위해 임의로 작성했다.

만약 var이 메모리 100번째에 저장되어 있다면 포인터는 100이라는 주소값을 가지고 있는 것이다. 그리고 이러한 포인터의 주소값을 활용해 해당 변수에 접근할 수 있다. 


포인터 선언

// 데이터_자료형* 변수명;
char* pointer;
char *pointer;
char *p1, *p2;

포인터를 선언하기 위해서는 포인터가 가르킬 값의 자료형을 선언해 주어야 한다. 그리고 *을 붙이면 포인터를 선언할 수 있게 된다. *의 위치는 자료형 뒤에 붙이거나 변수명의 앞에 붙여 사용할 수 있다. 

// &변수명 -> 변수의 주소값
char* pointer = &var;

&는 변수의 주소값을 뜻한다. 

#include <stdio.h>

int main(void)
{
    char var = 'A';
    char* pointer = &var;

    printf("*pointer: %c\n", *pointer);  // *pointer : A

    return 0;
}

만약 pointer 변수 앞에 *를 붙이면 포인터에 지정된 값(주소값)에 위치한 메모리에 접근한다.  

정리:

#include <stdio.h>

int main(void)
{
    char var = 'A';
    char* pointer = &var;

    printf("var: %c\n", var);
    // var: A
    printf("pointer: %#x\n", pointer);
    // pointer: 0x60ffc74
    printf("*pointer: %c\n", *pointer);
    // *pointer : A
    return 0;
}

함수 활용

포인터를 활용하면 함수에서 여러 값을 반환하는 효과를 낼 수 있다.

#include <stdio.h>

void AddTen(int*, int*);

int main(void)
{
    int a = 3;
    int b = 6;

    AddTen(&a, &b);
    printf("a: %d, b: %d", a, b);
    // a: 13, b: 16

    return 0;
}

void AddTen(int* num1, int* num2)
{
    *num1 += 10;
    *num2 += 10;
}

함수에 변수들의 값을 복사해 주는 것이 아니라 변수에 접근할 수 있는 주소 정보를 전달하는 것이다. 

기존에 매개변수에 직접 데이터를 넘겨주던 방식과는 다르게 함수에서 직접 데이터에 접근해 작업을 수행한다. 

위 코드의 초기 상태를 도식화하면 위 이미지와 같다.

만약 AddTen 함수를 실행하면 아래와 같이 변하게 되는 것이다.