Pointer
포인터는 일반 데이터를 저장하는 변수가 아닌 메모리의 주소 값을 저장하는 변수이다.
포인터도 변수기 때문에 메모리 어딘가에 저장되기 때문에 포인터도 주소 값을 가지고 있다.
포인터 연산자
포인터 변수를 이용하면서 2가지의 연산자가 사용되는데, & 과 *이다.
여기서 &는 주소 연산자이고 *은 참조 연산자이다.
🟣 주소 연산자 &는 변수 이름 앞에 사용하여 해당 변수의 메모리 주소 값을 반환한다.
🟣 참조 연산자 *는 포인터의 이름이나 주소 앞에 사용하며 해당 주소를 참조하여 주소에 저장되어 있는 값을 반환한다.
포인터 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h>
int main()
{
int a = 10;
printf("a = %d\n", a); // a = 10
printf("&a = %p\n", &a); // p: 포인터, a의 주소값을 출력 -> &a = a의 주소값
int* p = &a; // 포인터 변수를 생성하고, 거기에 a의 주소값 할당
printf("p = %p\n", p); // 포인터 p변수 안의 값을 출력 -> p = a의 주소값
printf("*p = %d\n", *p); // *p를 써서 그 공간을 사용하여 접근 -> *p = 10
printf("&p = %p\n", &p); // 포인터p 자체의 주소값 출력 -> &p = p의 주소값
return 0;
}
|
cs |
✅코드 분석✅
➡️ 5 Line int형 a 변수에 10을 할당
➡️ 9 Line int형 포인터 p 변수에 a의 주소값을 할당
➡️ 10 Line 결국 int형 포인터의 p변수 자체에는 a의 주소값이 들어가게 되고,
➡️ 11 Line *p를 사용하면 포인터 p변수가 a변수 공간을 가리키게 되어 a변수 안으로 접근할 수 있게 되어서 a의 값이 나오게 된다
따라서 이렇게 *p로 a 변수에 접근하여 a의 값을 변경할 수도 있다.
1
2
3
|
*p = 20;
printf("a = %d\n", a);
printf("*p = %d\n", *p);
|
cs |
➡️ 12 Line ⚠️주의해야 할 점: 포인터 p도 하나의 변수기 때문에 그 자체의 주소값을 가지고 있다 (따라서 a변수의 주소값과 다름!)⚠️
두 값을 바꾸는 Swap 함수 예시
1. reference(레퍼런스 / &) 사용 ➡️ Call by reference
참조에 의한 호출 / 함수 내에서 매개변수로 참조자가 정의되며, 인자로 넣은 변수로 초기화되며 이 변수를 참조하게 된다
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
|
#include <stdio.h>
void Swap(int& e, int& f) // 레퍼런스 : 같은 공간 사용 - 주소가 같으면 같은변수
{
printf("&e = %p\n", &e);
int temp = e;
e = f;
f = temp;
}
int main()
{
int a = 10;
int b = 20;
printf("&a = %p\n", &a);
printf("a = %d, b = %d\n", a, b);
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
|
cs |
2. pointer(포인터) 사용 ➡️ Call by address
주소에 의한 호출 [포인터를 이용한 전달방식] / 함수 호출 시 변수의 주소를 인자로 넣어서 호출하는 방식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void Swap(int* e, int* f) // 포인터 사용
{
int temp = *e;
*e = *f;
*f = temp;
}
int main()
{
int a = 10;
int b = 20;
printf("a = %d, b = %d\n", a, b);
Swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
|
cs |
더블(이중) 포인터
더블 포인터도 (싱글) 포인터와 마찬가지로 메모리 공간의 주소를 저장하는 변수이다.
하지만 더블 포인터는 싱글 포인터의 주소 값을 저장하기 위한 포인터이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
int main()
{
int a = 10;
int* b = &a;
int** c = &b;
printf("a = %d\n", a);
printf("*b = %d\n", *b);
printf("**c = %d\n\n", **c);
printf("&a = %p\n", &a); // a의 주소
printf("b = %p\n", b); // a의 주소
printf("*c = %p\n\n", *c); // a의 주소
printf("&b = %p\n", &b); // b의 주소
printf("c = %p\n\n", c); // b의 주소
printf("&c = %p\n", &c); // b의 주소
return 0;
}
|
cs |
✅코드 분석✅
➡️ 5 Line int형 a 변수에 10을 할당
➡️ 6 Line int형 포인터 변수에 a의 주소값을 저장
➡️ 7 Line int형 포인터를 담는 int형 더블포인터에 변수에 b의 주소값을 저장
➡️ 20 Line int형 더블 포인터인 c도 변수이기 때문에 자신의 주소값을 가진다
더블 포인터 함수 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
void Alloc(int** p)
{
*p = new int();
**p = 10;
}
int main()
{
int* a = nullptr; // 주소값 초기화
Alloc(&a);
printf("*a = %d\n", *a);
return 0;
}
|
cs |
출처 및 참고: 강의 짱잘하시는 울 유니티 선생님 수업
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)