• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

6.17 for each 강의에서 질문있습니다.

22.10.13 11:11 작성 조회수 188

0

for each를 이용하여 간단하게 최댓값을 구하는 방법을 알고, 함수를 사용하여 구현해보면 좋겠다고 생각하여

코드를 짜보았습니다. 함수의 입력으로 배열을 매개변수로 넣었는데 오류가 떴습니다.

비슷하게 vector를 이용하여 매개변수 인수로 넣어보니 잘 작동하였습니다.

이유가 무엇일까요?

답변 2

·

답변을 작성해보세요.

0

강민철님의 프로필

강민철

2022.10.13

답변 감사드립니다^^

0

oort_cloud98님의 프로필

oort_cloud98

2022.10.13

매개변수로 배열 사용하시려면 선언시에 받아올 인자가 배열임을 알려주어야 합니다.
ex) void max_number(const int arr[]){}

또는 포인터를 사용해주어도 됩니다.

ex) void max_number(const int* arr){}

함수 사용시에는 배열명만 넣어주시면됩니다.

tjehgus00님의 프로필

tjehgus00

질문자

2022.10.13

위 방법대로 바꾸어서 실행시켜봤는데 똑같이 오류가 떠서 댓글 남깁니다.

oort_cloud98님의 프로필

oort_cloud98

2022.10.13

for each문을 사용하셨군요
해당 반복문은 배열일 경우 정적 배열만 사용이 가능합니다.
정적 배열은 크기가 정해져있는 배열이라고 생각하시면 될 것 같습니다.
매개변수로 받는 배열은 컴파일시 크기가 정해지지 않아 동적배열로 취급이 됩니다.

tjehgus00님의 프로필

tjehgus00

질문자

2022.10.13

이해 됐습니다. 감사합니다.

감자탕집아들님의 프로필

감자탕집아들

2022.10.13

정적배열도 함수의 매개변수로 사용되면 함수가 포인터로 받기때문에 동적 배열로 취급된다는 말씀이신가요?

그렇다면 매개변수로 배열을 받는 함수 안에서 for each문을 사용하려면 어떻게 해야하나요? 지금 드는 생각은 구조체를 생성해서 그안에 배열을 넣어 매개변수로 넣으면 정적배열로 인식을 할거 같긴한데 ...너무 번거로울거같은데 다른방법이 혹시 있을까요?

 

oort_cloud98님의 프로필

oort_cloud98

2022.10.13

알고있는 선에서 답변을 드리자면...
함수의 매개변수로 배열을 받을 때
첫번째 값의 주소를 넘겨주게 되는 것으로 알고 있습니다.

void function(int array[]) 와 같이 선언해 사용하는 함수를 예로 들 때
int testArr[] = {1, 2, 3, 4}; 와 같이 선언한 배열 변수를 인자로 넘겨주겠습니다.

function(int[]) 함수의 실행 동작은
{

std::cout<< array[5] << "\n";

}
와 같을 때 컴파일러는 받은 배열의 크기는 알지 못해 오류를 내지 않습니다.
이게 제가 말한 컴파일러가 동적배열로 취급한다는 의미입니다.
컴파일러는 배열을 매개변수로 받을 때 제일 처음값의 주소를 받아
다음 값의 주소를 찾아 해당 값을 출력하게 됩니다.

testArr[]의 주소가 {0, 4, 8, 12} 라고 했을 때 (편의상 십진수로 표기했습니다 실제 주소는 16진수입니다.)
런타임에러가 나오는 출력문은 마지막 주소를 넘어 16이라는 주소에서 값을 가져오려 해서 에러가 나옵니다.

매개변수로 받은 배열을 for_each문에 사용하고 싶은 경우에는
함수 선언을 아래와 같이 하면 됩니다.
void function(int (&arg)[4])

배열의 크기를 꼭 지정해주어야 합니다. 인자로 넘기는 배열의 크기가 달라도 안됩니다

감자탕집아들님의 프로필

감자탕집아들

2022.10.13

답변 감사합니다!

배열이 함수의 매개변수로 사용될 때, 배열의 크기가 정해지지 않은것 처럼 넘어 가기 때문에 동적 배열처럼 취급 되었다고 보는 것이군요.

알려주신 함수선언 void function(int (&arg)[3])에서서 배열 사이즈를 고정시키기 위해서라면 3대신 4를 넣는게 맞을까요?

그리고 void max_number(const int arr[]){}와 같이 함수선언을 하게 되면 함수가 배열의 주소를 받아 포인터처럼 사용하기 때문에 참조자나 포인터(&, *)를 매개변수에 입력하지 않아도 포인터나 참조처럼 해당 함수 밖에서도 함수안에서 변경된 변수값들이 유효한것으로 이해하면 되는건가요?? 그렇다면 강의에서 함수의 매개변수로 배열이 들어가면 주소로 받지만, 구조체 멤버로써의 배열이 들어가게 되면 값을 받는 다고 하셨던거 같은데.. 이러면 함수안에서 변경된 배열은 함수안에서만 유효하겟군요

마지막으로 for each 문이 정적배열에만 사용가능한 이유는 동적 배열은 배열의 크기가 컴파일 타이밍에 정해져있지 않기 때문에 for each문을 돌렸을때 몇번을 반복해야하는지 모르기때문에 안되는것으로 이해하면 될까요?

oort_cloud98님의 프로필

oort_cloud98

2022.10.14

알려주신 함수선언 void function(int (&arg)[3])에서서 배열 사이즈를 고정시키기 위해서라면 3대신 4를 넣는게 맞을까요?
-- 예시로 만든 함수에 배열 사이즈는 제가 오타를 냈네용 수정했습니다

void max_number(const int arr[]){}와 같이 함수선언을 하게 되면 함수가 배열의 주소를 받아 포인터처럼 사용하기 때문에 참조자나 포인터(&, *)를 매개변수에 입력하지 않아도 포인터나 참조처럼 해당 함수 밖에서도 함수안에서 변경된 변수값들이 유효한것으로 이해하면 되는건가요??

-- 네 제가 이해한 것과 동일합니다.

함수의 매개변수로 배열이 들어가면 주소로 받지만, 구조체 멤버로써의 배열이 들어가게 되면 값을 받는 다고 하셨던거 같은데.. 이러면 함수안에서 변경된 배열은 함수안에서만 유효하겟군요

-- 네 제가 이해한 것과 동일합니다.

for each 문이 정적배열에만 사용가능한 이유는 동적 배열은 배열의 크기가 컴파일 타이밍에 정해져있지 않기 때문에 for each문을 돌렸을때 몇번을 반복해야하는지 모르기때문에 안되는것으로 이해하면 될까요?

-- 네 제가 이해한 것과 동일합니다.

감자탕집아들님의 프로필

감자탕집아들

2022.10.14

친절한 답변 감사드립니다. 많은 도움이 되었습니다!!