• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

9-18. 포인터형 매개변

23.08.31 20:18 작성 23.08.31 20:19 수정 조회수 227

2

안녕하세요!

강의 마지막 코드를 제가 제대로 이해했는지 궁금하여 질문 드립니다.

 

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

void swap(int* u, int* v)

{

printf("%p %p\n", u, v);

int temp = *u;

u = v;

*v = temp;

}

int main()

{

int a = 123;

int b = 456;

printf("%p %p\n", &a, &b);

swap(&a, &b);

printf("%d %d\n", a, b);

return 0;

}

 

  1. a와 b의 주소 값이 매개 변수의 값으로서 함수 swap()에 입력된다.

  2. 즉 int* u = &a가 되고, int* v = &b가 된다.

  3. swap() 함수의 변수 u는 main() 함수의 변수 a의 주소가 저장된 포인터 변수가 됐고, v또한 마찬가지다. u, v에 각각 a와 b의 주소 값이 저장됐기 때문에 이것을 실행하면 main() 함수의 a, b의 주소 값과 동일하게 출력된다.

  4. 이후 변수 temp에 변수 a의 주소를 redirection 하여, 해당 주소 안에 저장된 값을 대입한다(a의 주소로 접근 -> 주소 안에 있는 값 123 temp에 대입).

  5. a의 주소로 직접 접근하여 그 주소의 값을 b의 주소 안에 저장된 값으로 변경한다.

  6. 이후 b의 주소로 직접 접근하여 그 주소의 값을 변수 temp의 저장된 값으로 변경한다.

  7. swap() 함수에서 a, b의 주소로 직접 접근해 값을 변경했기 때문에 함수들의 영역이 달라도 main() 함수 변수들의 값은 정상적으로 swap 된다.

 

감사합니다.

답변 2

·

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.09.01

안녕하세요, 답변 도우미 Soobak 입니다.

우선, 강의의 마지막 코드와 첨부해주신 코드의 swap() 함수의 구현부가 다릅니다.

  • 질문자님의 swap() 함수 코드

    void swap(int* u, int* v)
    {
      printf("%p %p\n", u, v);
    
      int temp = *u;
    
      u = v; // 이 부분이 다릅니다.
    
      *v = temp;
    }
  • 강의 마지막의 swap() 함수 코드

    void swap(int* u, int* v)
    {
      printf("%p %p\n", u, v);
    
      int temp = *u;
    
      *u = *v;
    
      *v = temp;
    }


따라서, 오타가 나신 것이 아니라면, 3 번 설명 ( u = v; 에 관한 설명부분~) 부터 잘못된 설명이 됩니다.

  • 3번 설명에 관하여
    : u = v; 에서 u 가 가리키는 주소를 v 가 가리키는 주소로 변경한 것이므로, uv 가 가리키는 대상만 바뀐 것이지, ab 의 값이 직접 변경된 것은 아닙니다.

  • 4번 설명에 관하여
    : *v = temp;v 가 가리키는 주소, 즉 b 의 값에 temp 를 저장합니다. a 의 값은 그대로입니다.

  • 5번 설명에 관하여
    : u = v; 의 코드 부분과 관련하여, u 가 가리키는 주소는 변경되지만, ab 의 값을 변경하지는 않기 때문에, 결과적으로 swap() 함수가 종료된 후에도 ab 의 값은 그대로입니다.

 

만약, 오타가 나신 것이라면, 즉, 위에서 첨부드린 강의의 마지막 swap() 함수 코드를 기반으로 말씀해주신 설명이라고 가정하였을 때는, 올바르게 잘 이해하시고 설명해주신 것이 됩니다.

1

이재완님의 프로필

이재완

질문자

2023.09.01

쓰는 과정에서 오타가 난 듯 싶네요.. 친절한 답변 감사합니다!