|
" int y를 해놯는데 근데 그 y의 값은 어디에있는지--;; "
" 그리구 x[] 이거는 갑자기 왜나오는지. "
이 말씀으로 제가 미루어 짐작건데
함수호출을 "largest(array, MAX);" 이렇게 했는데
함수선언부와 함수정의부의 함수프로토타입이
"largest(int array[], int MAX)"이렇게 되어 있지 않아
혼란스러우신거 같습니다.
먼저 C에서 함수를 호출 할때 자료를 아규먼트(array, MAX)로 넘기고
호출 받는 쪽에서 파라메타(int x[], int y)로 받는 방법은
'값에 의한 호출(call by value)'입니다.
'주소(포인터)에 의한 호출(call by address)'이 있습니다만 이것은
'참조에 의한 호출(call by Reference)'이 지원되지 않는 C가 '값에 의한 호출'을
이용해 '참조에 의한 호출'을 구현한 것이라고 생각합니다.
결론은 '값에 의한 호출'의 특징을 아시면 될것 같습니다.
한마디로 말하자면 '복사'입니다.
현재 프로그램은 array와 MAX가 전역변수지만 main에 선언된 지역변수
라고 생각하고(실제로 데이타영역에 저장되는 전역변수로 하셨기때문에
함수의 매개변수를 사용하지 않고 그냥 쓰셔도 되니까 이경우는
별 의미가 없다고 생각합니다. 데이타영역의 자료는 공용입니다.)
스택영역에서 main함수의 변수영역을 'A', largest함수의 변수영역을 'B'
라한다면 각 함수는 서로 다른 영역의 자료를 사용할 수 없습니다.
그래서 largest함수가 호출되면 B영역에 x, y라는 이름으로 변수를 만들고
A영역의 자료 array, MAX의 값을 B영역의 x, y에 복사합니다.
그리고 이제부턴 x와 y라는 이름으로 사용하는것이죠.(이부분을 이해하시면
될것 같습니다.)
물론 array, MAX라 해도 됩니다.
다만 이름이 같을뿐 서로 다른 A, B영역에 따로 존재하는 변수입니다.
실제로 컴파일되면 변수이름은 주소가 되니까 컴퓨터 입장에서는 당연히 다른 변수입니다.
여기서 중요한게 y는 그냥 변수이지만 x는 포인터 변수라는겁니다.
y와 MAX의 '값'은 같지만(복사) B영역의 y의 값을 변화 시켜도 A영역의
MAX는 전혀 변화가 없죠.
그러나 x의 값은 A영역의 메모리 주소이기 때문에 '간접참조'를 하여
비로소 largest함수에서 main함수의 변수영역에 있는 변수의 '값'을 바꿀수 있게 되죠...
이렇게 번거롭게 자료를 사용하지만 '값에 의한 호출'의 장점은 함수(모듈)간
독립성이 유지되는것에 있다고 볼 수 있습니다.
(10여분 경과...)
끝맺음을 어떻해 해야할지...
오히려 헷갈리시면 죄송합니다.
덧말...
위의 설명은
"시스템 엔지니어를 위한 C/C++ 완벽가이드" (홍릉출판사),
"터보 C 정복" (가남사),
"C 포인터 이렇게 활용한다" (가남사)
를 종합한 결과 이오니
본인은 함수 호출 방법의 이견 혹은 오류에 대한 어떠한 책임도 지지 않습니다.
대신 제가 잘못 전달한 부분에 있다면...책임은 못지고...리플 달아주세요^^
|