인프런 커뮤니티 질문&답변

김준한님의 프로필 이미지
김준한

작성한 질문수

홍정모의 따라하며 배우는 C++

7.4 주소에 의한 인수 전달

sinout cosout

작성

·

205

0

//7.4 주소에 의한 인수전달 call by address

#include <iostream>

using namespace std;

//sinout cosout을 포인터로 구현하기

void sinout_cosout(double degrees, double* sin_out, double* cos_out)

{ // main 함수에 값이 바뀐다.

*sin_out = 1.0;

*cos_out = 2.0;

}

int main()

{

// sin cos

double degrees = 30;

double sin= 10.0, cos = 20.0;

cout << sin << " " << cos << endl;

sinout_cosout(degrees, &sin, &cos);

cout << sin << " " << cos << endl;

return 0;  

}

 Q.1 참조에 의한 값 전달도 아닌데 함수에서 sin cos 값이 1.0과 2.0으로 바뀐다고 main 함수에서 값이 바뀌는 이유가 궁금해요

답변 2

0

"주소에 의한 전달" 이기 때문에 그렇습니다!

sinout_cosout(degrees, &sin, &cos);

sinout_cosout 함수에다가 sin과 cos 의 주소를 넘겨서 sinout_cosout 함수의 매개변수인 포인터 sin_out, cos_out 이 각각 sin과 cos 의 주소를 가리키게 됩니다.

이를 통하여 간접참조로 값을 바꿨으니 주소의 주인공인 sin과 cos 의 값이 바뀌게 됩니다. 

포인터에서 배우신 간접 참조를 다시 상기해보세요! "주소에 의한 전달"이 이번 강의의 주제이니 이번 강의도 다시 한번 복습해보시면 이해가 되실 것 같습니다.

0

그러니까 reference를 사용하지 않았는데 값이 바뀌는 이유를 모르겠다는것 맞나요?

질문의 의도를 제대로 파악하지 못했지만  제가 이해한것이 맞다면 포인터를 쓰셨기 때문에 값을 바꿀수있다고 할수있겠네요 

저도 아직 부족하지만 제가 생각하는 범위내에서 설명아닌 설명을 한다면 

1. 포인터도 변수이므로 주소를 가진다 

void fun(int *c)

{

    int b = 7; //지역 변수

     c= &b;

}

main()

{

   int a=9;

   int *ptr = &a;

   fun(ptr)                  // 포인터도 변수이므로 주소를 가진다 

}

2. *은 포인터 변수에 있는 주소값을 가리키는 값이다 

*c = ptr 전달되면 ptr 변수에 있는 주소값이 c로 복사된다 

포인터 변수 c에는 ptr 변수의 주소값이 들어간다

c의 주소값이 가리키는 값을 바꾸면 ptr이 가리키는 값도 바뀐다 -> main에 영향을 줄수있다 

c의 주소값 다른 주소를 넣는다면(c = &b) c는 ptr의 주소가 아니라 b의 주소값이 들어가면서 

ptr과 다른곳을 가리킨다 또 b는 지역변수이기때문에 void fun{}안에서만 유효하다 

때문에 main에 영향을 줄수없다 

제가 설명 했던 내용에 수정해야할 사항이 있다면 반드시 지적해주세요!

*은 포인터 변수에 있는 주소값을 가리키는 값이다 *c = ptr 전달되면 ptr 변수에 있는 주소값이 c로 복사된다 

라고 적으신게 오해의 소지가 있는 것 같아 정정하자면 

*이 포인터 변수에 붙으면 간접 참조가 되므로 포인터 변수값(즉 주소값)으로 찾아가면 있는 데이터 값이다.

*c = ptr 는 간접참조식이기 때문에 c = ptr 

라고 좀 더 정확히 전달 드리고 싶습니다.

대신 답변 감사드립니다. ☺

김준한님의 프로필 이미지
김준한

작성한 질문수

질문하기