본문 바로가기

개발/c

[C] 포인터란 무엇일까?

반응형

포인터란?

포인터란 변수가 저장되어 있는 메모리의 주소를 포인터 라고 합니다. 포인터 변수 라고도 부릅니다.

포인터 사용 방법

1. 포인터의 연산자

포인터는 크게 두 가지의 연산자가 존재합니다.

 

1-1. & 주소 연산자

변수의 주소를 가져오는 연산자 입니다.

 

1-2. * 참조 연산자

포인터가 가지고 있는 메모리 주소에서 변수 값을 가져오는 연산자 입니다.

2. 포인터 변수 선언

int main() {
    int x = 10;
    int *y = &x;
    printf("x: %d, %p\n", x, y);
    return 0;
}
출력:
x: 10, 0x7ffeefbff438

 

포인터 변수는 변수명 앞에 *을 붙여서 선언합니다. 그리고 변수의 주소는 &로 가져와서 초기화 시켜 줍니다.

3. 역참조 연산자 사용

int main() {
    int x = 10;
    int *y = &x;
    printf("x: %d, %p\n", x, y);
    *y = 324;
    printf("x: %d, %p\n", x, y);
    return 0;
}
출력:
x: 10, 0x7ffeefbff438
x: 324, 0x7ffeefbff438

 

1-2에서 설명 했듯이 포인터 변수 앞에 *을 붙이면 주소에 접근하여 값을 참조합니다. 그래서 *포인터 한 뒤에 대입 연산자로 변수를 바꾸는것 역시 가능합니다.

 

void swap(int a, int b);
void swap_deref(int *a, int *b);

int main() {
    int a = 200, b = 300;
    
    swap(a, b);
    printf("a: %d, b: %d\n", a, b);
    swap_deref(&a, &b);
    printf("a: %d, b: %d\n", a, b);
    
    return 0;
}

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

void swap_deref(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
출력:
a: 200, b: 300
a: 300, b: 200

 

역참조 연산자는 이런식으로 활용이 가능합니다. swap()함수는 함수 내부에 지역변수를 3개나 생성해서 처리하는 반면, swap_deref()함수는 지역변수를 하나만 만들고 메모리에 직접 접근해서 처리하기 때문에 사용하는 자원의 양과 속도에서 더 좋습니다.

반응형

'개발 > c' 카테고리의 다른 글

[C] typedef란 무엇일까?  (0) 2021.08.16
[C] 구조체란 무엇일까?  (0) 2021.08.14