Ch 09. 함수 - 04. 주소로 전달

2025. 4. 18. 10:12Programming Language/C++

반응형

이전에는 값을 함수에 전달인자로 전달했을 경우를 보았었고 그 경우에는 함수를 호출한 쪽에서 전달한 변수는 값만을 복사해서 전달하고 호출 된 함수 내부의 매개변수의 변수는 그 값을 통해 초기화 하고 내부에서 매개변수의 값이 변경되더라도 호출된 쪽의 전달 인자의 값을 바꾸진 않는다는 것을 보았었다.

 

이번엔 값을 전달하는게 아니라 주소를 전달하는 방법에 대해서 알아보자.

 

1. 함수에 변수의 주소값를 전달

함수에 변수의 주소값을 전달하기 위해서는 포인터를 사용해야한다.

이걸 그대로 사용해보자면 바꿔야 할 부분은 함수의 매개변수의 타입이다.

 

[changer 함수부]

이걸 둘다 포인터로 변경해주면

받을 준비는 완료되었다.

이제 내부의 로직도 포인터를 사용하는 방법으로 바꿔보자.

 

[main함수부: 함수를 call하는 곳]

이제 main함수 부에서 함수를 부를 때 전달인자를 주소값으로 전달해주자.

이제 실행시켜보면

값이 바뀐 것을 알 수 있다.

 

한번 주소값을 확인해보면

이렇게 같은 주소값을 바라본다는 것을 알 수 있다.

 

2. 조금 다른 배열의 주소 전달

배열도 주소값을 전달할 수 있는데 포인터와는 조금 다르다.

배열의 경우는 

이렇게 main에서 배열을 만들어 배열의 이름을 전달하면 changer에서 배열로 값을 받을 수 있다.

그런데 main에서 전달하는 배열의 크기는 5이고 매개변수 쪽에서도 크기를 5인 배열 타입으로 받아주고 있는데 사실 매개변수 쪽의 경우는 배열의 길이를 다르게 작성해도 에러를 발생시키지 않는다.

심지어 배열의 길이를 넣지 않더라도 문제가 없다

 

그래서 이렇게 전달받은 배열을 출력해보려고 할때 range based for문을 통해서 값을 출력하려고 하면

이렇게 에러를 반환하는 것을 볼 수 있다.

이 에러는 왜 발생하는 것일까 ? 

 

사실 배열로 전달한 

이 매개변수의 타입은 

이렇게 타입에 대해서 출력해보면

포인터 타입인 것을 알 수 있다.

 

그런데 range based for문의 경우에는 전달하는 배열 혹은 순회가 가능한 타입에 멤버 함수에 begin(), end()함수가 존재해야만 실행이 가능하다.

for (auto x : something) // ← 이 something은 begin(), end() 있어야 함

 

근데 iarr, int * 타입의 경우는 컴파일러가 그 값만을 보고 begin(), end() 같은 함수가 존재하는 것 확인하지 못하기 때문에 에러가 발생하게 되는 것이다.

 

그래서 사실은

이 매개변수의 타입을 

 

이렇게 변경해도 완전히 동일한 함수로 작동할 수 있다.

 

또한 만약 값을 함수에서 반환한다고 한다면 그 또한 타입은 포인터로 return하게 되기에 함수의 반환 타입을

이렇게 포인터의 형태로 반환을 해줘야만 한다.

 

물론 함수를 저렇게 선언하면 int 가 먼저 스택에서 사라지기 때문에 받는 포인터는 값을 받을 수 없기에 저렇게 구현해서는 안되긴 한다. 

예시를 보여주기 위해서 만든 것이니 동일한 구성으로 함수를 만들지는 않기를 바란다.

 

 

반응형