• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

void swap(char** x, char** y) 함수의 내부에서

21.12.17 21:26 작성 조회수 496

0

void swap(char** x, char** y) {
	char* temp = *x;
	*x = *y;
	*y = temp;
}

이 함수에서 질문이 있습니다.

문자열 배열을 매개변수로 전달하기 위해서 이중포인터를 썻다는 것은 이해가 됐고,

임시 변수 temp에 문자열을 담아야 하니 

char* temp 로 선언해준 것도 이해가 됐는데요,

왜 void swap() 함수 내부에서는, 매개변수로 이중포인터를 받아줬음에도  *x, *y로 사용하나요?(**x,**y가 아니라)

그리고 마지막 *y = temp; 문장도 temp선언을 포인터로 해줬는데 *y = *temp가 아닌 이유를 모르겠어요

 

답변 1

답변을 작성해보세요.

1

안녕하세요? 좋은 의문을 갖고 계시네요.

*x와 *y 대신 **x와 **y를 썼을 때 어떤 일이 발생했나요?

 

swo98님의 프로필

swo98

질문자

2021.12.18

안녕하세요 직접 답 달아주시니 감사합니다. 우선

void swap(char** x, char** y) {
	char* temp = **x;
	**x = **y;
	**y = *temp;
}

이렇게 코드 써봤는데 컴파일은 되고 런타임에서 에러가 납니다. 

이중포인터로 swap해주는 경우와, 단일포인터로 swap해주는 경우의 차이는 알겠는데, 코드를 쓸 때 이중포인터니까 이렇게 써야 하는 것이 아닌가 하는 의문입니다.

아무래도 매개변수로 써준 표현 그대로 쓰면 어떤문제가 있는지 감이 안옵니다

그리고 만약 *연산자를 1개만 써준다고 한다면 임시로 값을 저장해둘 temp 변수도 포인터변수가 아니라 그냥 이렇게 써줘야 하는 것 아닌가 하는 의문도 있습니다

void swap(char** x, char** y) {
	char temp = *x;
	*x = *y;
	*y = temp;
}

 

11장 까지면 꽤 많이 보셨네요. 사람마다 이해했다라고 느끼는 정도가 다른데, 여기서는 런타임 에러가 왜 나는지를 찾아내셔야 합니다. 디버거가 런타임 에러가 어디서 나는지는 잡아줄텐데, 보통 포인터 런타임 오류를 찾을때는 주소값을 모두 적어놓고 따져보면서 시작합니다.

개념적인 차이는 앞에서 문자열이 아닌 일반 변수의 swap도 배우셨을텐데 두 개를 비교해보시면 도움이 될 것 같네요.