포인터란
메모리의 주소값을 저장하는 변수
*역참조 : 포인터가 가르키는 값을 가져오는것
이중 포인터란
포인터 변수의 주소를 저장하는 변수
int n = 100; // 변수의 선언
int *p = &n; // 포인터의 선언
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의 값도 변경됨
'자료구조' 카테고리의 다른 글
동적 메모리 할당, malloc, calloc, realloc (0) | 2021.05.03 |
---|---|
구조체, typedef (0) | 2021.05.03 |
시간 복잡도, 공간 복잡도 (0) | 2021.05.03 |
[자료구조] 정렬 알고리즘 (0) | 2021.03.02 |
[자료구조] Comparison Sort, In-place Sort (비교 정렬, 제자리 정렬) (0) | 2021.03.02 |