초기 네이버 기록/과거 공부 기록

헷갈릴때 보기! 예제 포인터의 포인터 인자로 받는 함수

뜨거운 개발자 2023. 1. 7. 01:18
/* 눈 돌아가는 예제. 포인터가 가리키는 변수를 서로 바꾼다.  */
#include <stdio.h>

int pswap(int** pa, int** pb);
int main() {
	int a = 1;
	int b = 2;
	int* pa, * pb;

	pa = &a;//pa는 a의 주소값
	pb = &b;//pb는 b의 주소값

	printf("pa 가 가리키는 변수의 주소값 : %p \n", pa);
	printf("pa 의 주소값 : %p \n \n", &pa);
	printf("pb 가 가리키는 변수의 주소값 : %p \n", pb);
	printf("pb 의 주소값 : %p \n", &pb);

	printf(" ------------- 호출 -------------- \n");
	pswap(&pa, &pb);//a의 주소값의 주소값, b의 주소값에 주소값 대입.
	printf(" ------------- 호출끝 -------------- \n");

	printf("pa 가 가리키는 변수의 주소값 : %p \n", pa);
	printf("pa 의 주소값 : %p \n \n", &pa);
	printf("pb 가 가리키는 변수의 주소값 : %p \n", pb);
	printf("pb 의 주소값 : %p \n", &pb);
	return 0;
}
int pswap(int** ppa, int** ppb) {
	int* temp = *ppa;//포인터는 ppa의 주소값을 가리킨다.즉 &pa이다.

	printf("ppa 가 가리키는 변수의 주소값 : %p \n", ppa);//ppa는a의 주소값의 주소값이다.
	printf("ppb 가 가리키는 변수의 주소값 : %p \n", ppb);//ppb는 b의 주소값의 주소값이다.
	printf("**ppa:%d\n", **ppa);
	*ppa = *ppb;//*ppa와 *ppb는 a와 b의 주소값이다. 
	*ppb = temp;

	return 0;
}

여기서 생긴 궁금증: 함수(int**ppa)에서는 ppa는 포인터의 포인터이다.

함수(int *ppa)에서는 ppa는 배열이다.

자 그러면 뭔가 이상하지 않은가?

왜 ppa가 그냥 포인터인 경우는 없는 걸까?

처음에 엄청 헤맸던게 왜 함수 (int *ppa)에서 ppa가 포인터가 아니냐는 거 였다. 궁금증을 해결해보고싶다.

 

이 글은 코딩 꼬꼬마 시절에 푼 문제를 보관한 글로 네이버에 저장해둔 글을 옮긴 글입니다.
혹시나 참고하시는 부분에 이상한 부분이나 질문이 생긴다면 남겨주시면 친절히 답변 드리겠습니다.

728x90