Layer7

포인터 보고서

cg10036 2019. 4. 7. 00:47

/*

   &num -> num의 주소값

   * -> 역참조 연산자

 

*/

 

 

1. 포인터란?

어떠한 값의 주소값이다.

#include <stdio.h>

int main()
{
    int num = 1;
    int *pnum = &num;
    printf("%d", *pnum);
}

 

#include <stdio.h>

int main()
{
    int num = 1;
    printf("%d", *&num);
}

위와 아래의 결과가 같게 나온다.

 

2. 포인터 선언방법

포인터는 2가지 방법으로 선언 가능하다.

 

int *num;
int* num;

차이점은 없다.

 

3. 다중포인터

포인터를 다중으로 사용하는것이다. 다중으로 갈수록 *이 붙는다.

2중포인터 : **ppnum -> *pnum -> num

5중포인터 : *****pppppnum -> ****ppppnum -> ***pppnum -> **ppnum -> *pnum -> num

#include <stdio.h>

int main()
{
    int num = 1;
    int *pnum = &num;
    int **ppnum = &pnum;
    int ***pppnum = &ppnum;
    int ****ppppnum = &pppnum;
    int *****pppppnum = &ppppnum;
    printf("%d", *****pppppnum);
}

 

4. 포인터를 쓰는 이유

직접적으로 메모리에 접근이 가능하다. 이는 c언어가 가지고 있는 가장 큰 장점이다.

 

5. call by value, call by reference

#include <stdio.h>

void run(int i)
{
    i = 1;
}

int main()
{
    int i = 0;
    run(i);
    printf("%d", i);
}
//Call By Value, i = 1

#include <stdio.h>

void run(int *i)
{
    *i = 1;
}

int main()
{
    int i = 0;
    run(&i);
    printf("%d", i);
}
//Call By Reference, i = 0

call by value는 다음과 같다. (<> -> 메모리이다)

<(MAIN) [i]> <(RUN) [i]>

<(RUN) [i]>에 0 대입 -> 실제 i에서는 바뀌지 않음

call by reference는 다음과 같다. (<> -> 메모리이다)

<(MAIN) [i]> <(RUN) [*i <- (MAIN) [i]]>

(RUN) [*i]에 0 대입 -> (RUN) [*i] = (MAIN) [i] -> (MAIN) [i]에 0 대입 -> 실제 i에서 값이 바뀜