NLP Learner in Switzerland

내가 이해하려고 쓰는 [포인터] Pointer 본문

Algorithm in C/Lecture Note

내가 이해하려고 쓰는 [포인터] Pointer

초코빵 2021. 5. 4. 10:00
728x90
반응형

 

 

* 유투버 동빈나님의 영상을 참조하여 정리한 것입니다.

 

 

 

이전에 배웠듯이 ampersand(&)는 해당 변수값이 들어있는 곳의 주소(address)이다.

포인터pointer를 나타내는 연산자는 asterisk(*)로 표기한다.

 

포인터를 간단하게 이해해보자.

int x = 70;

int *y = &x;

라고 선언했다고 가정한다.

그러면 x는 70이라는 값이고, y는 x의 주소를 가진다(e.g. 00AA00BB). 즉, y=&x이다.

그러면 *y는 뭘까? *y = 70이 된다. 즉, *y=x이다.

y=&x, *y=x 아하....??? well... ㅈㄴ헷갈린다... ㅡㅡ

 

뭐 일단은 *y=x니까,

x나 *y값을 바꾸게 되면 해당 변수값이 바뀐다.

그 예시를 보자.

#include <stdio.h>

int main(){
    int i=10; (i값은 10)
    int *p;
    p = &i; (p가 i의 주소를 가리킨다)
    printf("i=%d\n", i); (i값으로 10이 출력된다)
    *p = 20; (p포인터를 20으로 변경하면)
    printf("i=%d\n", i); (i값으로 20이 출력된다.
}

처음에 i의 값을 10으로 선언해주고, p라는 변수가 i의 주소를 가리키도록 설정했다.

이 상태에서 i를 출력해보면 그대로 10이 나오는데,

p포인터를 20으로 변경하면 i값이 20으로 바뀐다. 즉, 아래의 결과물이 도출된다.

p값이 i의 주소를 가리키고(p=&i) 있으므로 *p=i가 되기 때문이다. 따라서 *p값을 20으로 변경하면 i가 바뀐다.

정리해서 한마디로 쓰면, p=&i, *p=i이다.

 

 

 

좀 더 복잡한 예시를 보자. 아래의 코드에서 i,j,*p,*q의 값이 각각 무엇일까?

#include <stdio.h>

int main(){
    int i,j,*p,*q;
    i=10;
    p=&j;
    q=malloc(sizeof(int));
    *q=i;
    j=i;
    q=p;
    *q=5;
    printf("%d %d %d %d", i,j,*p,*q);
}

일단 i와 *q는 간단하다. i=10이고 *q=5이다.

문제는 j와 *p가 매우 헷갈린다.

p=&j이므로 *p=j이고 q=p=&j이므로 *q=j이다. 근데 *q=5이므로 *p와 *q도 전부 5가 된다.

따라서, 순서대로 10,5,5,5가 답이다.

 

 

 

 

 

Comments