포인터의 개념
기본 형태
int *a;
int형 포인터를 a로 선언한다는 뜻
*(asterisk)의 활용
- 포인터를 선언
- 해당 주소의 값에 접근 ← 중요!
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
int main (void)
{
int a = 42; //변수 선언, 초기화
int* ptr; //int형을 가르키는 포인터 p 선언
ptr = &a; //포인터 p에 a의 주소를 저장
printf("Integer* size : %d", sizeof(int*));
printf("Float* size : %d", sizeof(float*));
printf("Char* size : %d", sizeof(char*));
/* 출력결과
>>Char* size : 8
Integer* size : 8
Integer* size : 8
*/
//자료형에 상관없이 모든 포인터의 크기는 8바이트
printf("value of 'ptr' is %d ", *ptr);
/* 출력결과
>>value of 'ptr' is 42
*/
//ptr 앞에 * 붙여서 값을 가져옴
printf("address of 'a' is %x\n", &a);
printf("address of 'a' is %x ", ptr);
/* 출력결과
>>address of 'a' is ff000bc4
address of 'a' is ff000bc4
*/
//ptr이 a의 주소를 가르키기 때문에 &a(a의 주소)를 쓰는것과 같은 의미
return 0;
}
활용
포인터를 쓰지 않는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
void add(int a, int b)
{
a++;
b++;
}
int main()
{
int a = 1;
int b = 1;
add(a, b);
printf("a: %d, b: %d",a,b);
return 0;
}
위와 같은 코드를 실행시키면 다음과 같은 결과를 출력한다.
a: 1, b: 1
add함수에 a와 b 변수를 인자로 넘겼지만 main함수에서의 a,b와 add함수의 a,b는 별개로 인식되기 때문이다.
포인터를 쓰는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
void add(int *a, int *b)
{
(*a)++;
(*b)++;
}
int main()
{
int a = 1;
int b = 1;
add(&a, &b);
printf("a: %d, b: %d",a,b);
return 0;
}
이번에는 다음과 같이 add 함수를 호출할 때 a와 b의 주소값을 인자로 넘겼다.
a: 2, b: 2
add 함수는 매개변수로 포인터를 받기 때문에 포인터 각각을 역참조하여 더하게 되면 그 결과가 main함수의 각 변수에 반영됨을 알 수 있다.
Reference
https://youtu.be/A7C9-Ea_zBQ
https://dojang.io/mod/page/view.php?id=275