함수의 반환형이 int* 일 때, 주소말고 값을 반환해도 되는 까닭은 무엇인가요?
C 공부를 하다가 의문점이 생겨서 글을 올립니다.
함수 선언을 int* add1(int a, int b); 과 같이 했습니다.
그리고 main()에서
(1) int sum1=add1(a,b);
(2) int* sum1=add1(a,b);
이렇게 했을 때
함수의 정의를
(1)
int* add1(int a, int b)
{
int tmp=a+b;
return tmp;
}
(2)
int* add1(int a, int b)
{
static int* tmp;
*tmp=a+b;
return &tmp;
}
2가지로 나눠서 해봤는데
둘다 값이 a+b 한 값으로 나왔습니다..
반환형이 포인터면 주소 값을 넘겨주고 그걸 포인터 변수가 받는게 맞는거 같은데,
(1) 처럼 그냥 값을 넘겨주고 값을 받아도 출력이 되는 까닭을 모르겠습니다.
warning: initialization makes integer from pointer without a cast [enabled by default]|
warning: return makes pointer from integer without a cast [enabled by default]|
이런 경고메세지가 뜨긴 했습니다.
제가 생각하기에.. 함수의 반환형이 int*면 return 값이 주소가 되야 하고 (1)같이 int형을 넘겨주면 에러가 나야 될꺼 같은데
값이 나오는게 이해가 되질 않습니다..
C에서는 형변환이 비교적 자유롭습니다. 다른 자료형을
C에서는 형변환이 비교적 자유롭습니다.
다른 자료형을 리턴해주더라도 알아서 형변환 해줍니다.
물론 예외도 있습니다만..
주소라는것도 결국 저장되는 방식은 정수형이므로 연산 결과가 문제없이 나오게 됩니다.
이런 방법도 있습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
C에는 정수형과 포인터형 사이에 암시적인 형변환
C에는 정수형과 포인터형 사이에 암시적인 형변환 규칙이 있습니다.
포인터형이 쓰여야 할 곳에 정수형이 쓰이거나, 정수형이 쓰여야 할 곳에 포인터형이 쓰이면
자동으로 형변환을 해 줍니다.
물론, 이를 믿고 함부로 쓰는 것은 프로그래머가 알아채기 힘든 버그로 가는 지름길입니다.
메모리 정렬 문제라던가, 정수형 사이의 변환 규칙이라던가, 기타 등등...
한편, 가변 인자 함수의 매개변수에 대해서는 이런 규칙이 적용되지 않습니다.
당연한 얘기지만요.
댓글 달기