끄적끄적 코딩
article thumbnail

포인터란
메모리의 주소값을 저장하는 변수

*역참조 : 포인터가 가르키는 값을 가져오는것


이중 포인터란
포인터 변수의 주소를 저장하는 변수

int n = 100;   // 변수의 선언
int *p = &n; // 포인터의 선언

http://tcpschool.com/c/c_pointer_intro

 

int a = 10;
int *b = &a;
int **c = &b;
    
printf("%d\n", a);
// 10
printf("%p\n", &a);
// 0x20
printf("%p\n", b);
// 0x20
printf("%p\n", &b);
// 0x24
printf("%d\n", *b);
// 10
printf("%p\n", c);
// 0x24
printf("%p\n", &c);
// 0x28
printf("%p\n", *c);
// 0x20
printf("%d\n", **c);
// 10

a => 10
&a => 0x20 (a의 주소 값)
b => 0x20 (a의 주소 값)
&b => 0x24 (b의 주소 값)
*b => 10 (b가 가리키는 주소에 있는 값 = 0x20주소에 있는 값 = a)
c => 0x24 (b의 주소 값)
&c => 0x28 (c의 주소 값)
*c => 0x20 (c가 가리키는 주소에 있는 값 = 0x24주소에 있는 값 = &a, b)
**c => 10 (c가 가리키는 주소(0x24)가 가리키는 주소(0x20)의 값 = a)


Call by value란

함수에서 값을 복사해서 사용하는 방식

void set10(int num)
{
    num = 10;
}

int main() {
    int a = 1;
    set10(a);
    
    printf("%d", a);
    
    return 0;
}

// 출력 : 1

set10함수에서 변경된 값은 main 함수내에 있는 a의 값에 영향을 미치지 않음
a의 값을 num에 넣어서 해당 함수가 실행됨

 

Call by reference란
함수에서 주소값을 전달하는 방식

void set10(int *num)
{
    *num = 10;
}

int main() {
    int a = 1;
    set10(&a);
    
    printf("%d", a);
    
    return 0;
}
// 출력 : 10

set10함수에 a의 주소값을 전달하고 함수내에서 해당 주소에 있는 값을 변경하면서 main함수에 있는 a의 값이 변경됨
num은 a의 주소를 가지고 있으므로 *num의 값을 수정하면 a의 값도 변경됨

검색 태그