포인터란?🖱️

메모리의 주소값을 저장하는 변수입니다. [자료형 * 변수명] 의 형태로 선언하며, 값이 아닌 '값이 저장된 주소'를 가리킵니다.

  • int * p = &a 는, p가 변수 a의 주소를 저장한다는 뜻입니다.
    • &a: a의 주소값을 구함
    • p: 포인터 p 가 가리키는 주소에 있는 값을 의미
  • int * p = &arr[0] 과 int * p = arr 은 같습니다.
  • int * p = &arr[1] 과 int * p = arr[1] 은 다릅니다.
    • &을 붙이지 않으면 주소값이 아닌 두 번째 행 자체를 가리키는 것 

 

예제를 통해 살펴보겠습니다.

#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;

    printf("a의 값: %d\n", a);       // 10
    printf("a의 주소: %p\n", &a);    // 예: 0x7ffeefbff58c
    printf("p의 값: %p\n", p);       // &a와 같음
    printf("*p의 값: %d\n", *p);     // 10 (p가 가리키는 주소의 값)
    
    *p = 20; // 포인터를 통해 a의 값을 변경
    printf("a의 새로운 값: %d\n", a); // 20
}

a의 값과 a의 주소는 다른 의미입니다. 포인터를 통해 a의 값을 변경할 수 있으며, *p=a, p=&a 입니다. 

 

c언어는 기본적으로 함수에 인자를 넘길 때 복사본이 넘어가는 방식입니다. 이때 포인터를 넘기면 원본을 직접 조작하는 것이 가능해집니다. 

void setToZero(int *p) {
    *p = 0; // 원본 값 변경
}

int main() {
    int a = 10;
    setToZero(&a);  // 주소를 넘김
    printf("%d\n", a);  // 0
}

 

 

20년도에 출제된 기출 예제를 살펴보겠습니다.

void main(){
    char *p = "KOREA";
    printf("%s\n", p);
    printf("%s\n", p+3);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+2);
}

정답은 아래와 같습니다.

KOREA

EA

K

E

M

 

이중 포인터(double pointer)🖱️

포인터를 가리키는 포인터의 포인터로, 즉 포인터의 주소를 저장합니다. 정보처리기사 시험에서도 나왔던 것으로 기억합니다.

포인터 자체를 조작하거나 변경하기 위해 사용합니다.

 

비슷한 예제를 통해 살펴보겠습니다.

#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;
    int **pp = &p;

    printf("a의 값: %d\n", a);         // 10
    printf("*p의 값: %d\n", *p);       // 10
    printf("**pp의 값: %d\n", **pp);   // 10

    // 주소 출력
    printf("a의 주소: %p\n", &a);
    printf("p의 값 (a의 주소): %p\n", p);
    printf("p의 주소: %p\n", &p);
    printf("pp의 값 (p의 주소): %p\n", pp);
}

p는 &a를, pp는 &p를 가리키고 있습니다. (pp) --> (p) --> (a) 라고 생각하면 됩니다. 

 

+ Recent posts