고양이와 코딩
포인터 진짜 짜증남 본문
728x90
하면 할수록 헷갈림
* 함수 포인터의 일반적인 정의 *
(함수의 리턴형) (*포인터 이름) (첫 번째 인자 타입, 두 번째 인자 타입 ,,,,)
#include <stdio.h>
int pswap(int **pa, int *pb);
int main() {
int a, b;
int *pa, *pb;
pa = &a;
pb = &b;
printf("pa가 가리키는 변수의 주소값: %p \n", pa);
printf("pa의 주소값: %p \n", &pa);
printf("pb가 가리키는 변수의 주소값: %p \n", pb);
printf("pb의 주소값: %p \n", &pb);
printf(" ------------- 호출 -------------- \n");
pswap(&pa, &pb);
printf(" ------------- 호출끝 -------------- \n");
printf("pa가 가리키는 변수의 주소값: %p \n", pa);
printf("pa의 주소값: %p \n", &pa);
printf("pb가 가리키는 변수의 주소값: %p \n", pb);
printf("pb의 주소값: %p \n", &pb);
return 0;
}
int pswap(int **ppa, int **ppb) {
int *temp = *ppa;
printf("ppa가 가리키는 변수의 주소값: %p \n", ppa);
printf("ppb가 가리키는 변수의 주소값: %p \n", ppb);
*ppa = *ppb;
*ppb = temp;
return 0;
}
main 함수에서의 포인터 구조
- int a, b;는 두 개의 정수형 변수 a와 b를 선언
- int *pa, *pb;는 두 개의 정수형 포인터 변수 pa와 pb를 선언
- pa = &a;는 pa가 a의 주소를 가리키도록 한다.
- pb = &b;는 pb가 b의 주소를 가리키도록 한다.
이 시점에서:
- pa는 a의 주소를 가리킨다.
- pb는 b의 주소를 가리킨다.
pswap 함수 호출
pswap(&pa, &pb);는 pa와 pb의 주소를 pswap 함수에 전달한다. 따라서, pswap 함수에서:
- ppa는 pa의 주소를 가리킨다.
- ppb는 pb의 주소를 가리킨다.
pswap 함수 내부에서의 동작
- int *temp = *ppa;
- *ppa는 pa가 가리키는 값을 의미한다. ppa는 pa의 주소를 가리키므로, *ppa는 pa의 값, 즉 a의 주소를 의미한다.
- 따라서 temp는 a의 주소를 가리키게 된다.
- *ppa = *ppb;
- *ppb는 pb가 가리키는 값을 의미한다. ppb는 pb의 주소를 가리키므로, *ppb는 pb의 값, 즉 b의 주소를 의미한다.
- 따라서 *ppa = *ppb;는 pa가 b의 주소를 가리키도록 한다.
- *ppb = temp;
- temp는 a의 주소를 가리키고 있으므로, *ppb = temp;는 pb가 a의 주소를 가리키도록 한다.
결과적으로, pswap 함수가 끝난 후:
- pa는 b의 주소를 가리킨다.
- pb는 a의 주소를 가리킨다.
이를 통해 pa와 pb가 가리키는 값이 서로 바뀌게 된다!
따라서, temp가 a의 주소를 가리키는 이유는 temp가 *ppa, 즉 pa가 가리키는 값을 저장하기 때문이며,
&pa와 &a가 같은 것이 아니라, pa가 a의 주소를 가리키고 있다는 점이 중요
위 예제의 경우 타입은 int* 타입이므로, int*타입을 가리키는 포인터의 타입이 int** 이기 때문에
int pswap(int **ppa, int **ppb)
와 같이 함수를 정의한 것
'C' 카테고리의 다른 글
[LeetCode] Two Sum (0) | 2024.11.10 |
---|---|
함수 포인터 연습문제 (0) | 2024.06.16 |
function (1) | 2024.06.09 |
포인터 (0) | 2024.05.10 |
비트 연산 (0) | 2024.05.10 |