강의

멘토링

커뮤니티

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

mj K님의 프로필 이미지
mj K

작성한 질문수

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

6.4 배열과 선택 정렬 selection sort

array를 함수의 파라미터로 넣어주는게 이해가 잘 안가요

작성

·

937

3

교수님 array를 함수의 파라미터로 넣어주는 부분이 좀 어려운데 다시 한번 설명을 부탁드립니다 지난시간 6.2배열기초부분에서 설명해주셨는데 형식만봐서는 배열이지만 문법상 포인터다  설명해주셨는데 array를 함수의 파라미터로 왜 넣는거죠? 이유가 궁금합니다

답변 1

6

- 일단 array가 printArray 함수의 매개변수인 이유는, 파라미터로 넘겨받은 배열의 원소들을 출력받기 위해서입니다.  강의에 따르면, 교수님께서 만드신 printArray 함수가 하는 일은 배열의 원소들을 출력하는 것이지요! 그러려면 어떤 배열의 원소들을 출력할지를 printArray 함수가 알아야 하므로 printArray 함수에게 배열을 파라미터로 넘겨주는 것입니다!  그리고 이를 array 매개 변수가 받는 것이구요.

 예시를 들어 보았는데요.

printArray(firstArray, 3); 호출을 통해 매개변수인 array 에서, firstArray 파라미터를 받게 되어 firstArray 배열의 모든 원소를 출력해준 것을 확인할 수 있습니다. (내부적으로 array = firstArray 이렇게 복사가 일어납니다.)

마찬가지로 printArray(secondArray, 3); 호출을 통해 매개변수인 array 에서, secondArray 파라미터를 받게 되어 secondArray배열의 모든 원소를 출력해준 것을 확인할 수 있습니다. (내부적으로 array = secondArray 이렇게 복사가 일어납니다.)

- 형식만 봐서는 배열이지만 문법은 포인터다 라는 의미에 대해 설명드리겠습니다.

배열의 이름에는 항상 배열의 첫번째 원소의 주소값이 들어있습니다. 즉 firstArray 라는 이름의 배열이 있다면 이 'firstArray' 라는 이름의 변수에는 이 배열의 첫번째 원소인 1 의 메모리 주소값이 들어가있는 셈입니다. 어차피 배열의 원소들은 모두 다 메모리 상에서 옆집 이웃 사이로 따닥 따닥 붙어서 자리잡고 있기 때문에 첫 번째 원소의 주소만 알아도 다른 모든 원소들에 접근할 수가 있거든요. 따라서 첫번째 원소의 주소만 알아도 다른 원소들의 주소들까지 전부 알 수 있기 때문에 그냥 '배열의 이름 = 배열의 주소' 라고 생각하시면 될 것 같습니다.  (cout << firstArray << endl; 이렇게 배열 이름만 출력해보시면 주소가 출력된다는거 확인할 수 있으실거에요!) 

따라서  배열의 이름이 곧 배열의 주소라는건  포인터 변수에 배열의 이름을 할당할 수 있다는 의미가 됩니다. 포인터는 메모리 주소를 담을 수 있는 변수를 의미합니다. 포인터에 대해서는 6.7 강의에서부터 자세히 배우실거에요!

아무튼!  함수는 배열을 파라미터로 넘겨 받을 땐 배열 자체를 통째로 복사하여 받는 것이 아니라 파라미터로 들어온 배열의 주소를 넘겨 받아 그 주소를 통해 배열에 직접 접근하는 방식으로 일을 하기 때문에 array 매개 변수가 겉으론 int array[] 이런 배열 같아 보여도, 사실 포인터라는 것입니다. 

이렇게 array 타입을 int * array 포인터로 바꿔도 결과는 똑같다는 것을 확인할 수 있습니다. 어차피 배열이름도 곧 주소이기 때문에 내부적으론 int * array 이렇게 포인터로 처리가 되지만 그냥 배열을 넣을 것이라는 의미를 살리기 위해서 문법적으로 int arr[] 라고 써도 문제 없게 시스템 상에서 허용해준 듯 합니다. 

제가 위에서 (내부적으로 array = secondArray 이렇게 복사가 일어납니다.) 이렇게 설명을 드렸었는데요. 이 의미는 포인터 array 에 secondArray 배열의 주소를 할당한다는 의미와 같습니다. array 에 secondArray 주소를 복사하는 것이지요

앞으로 포인터와 배열의 관계에 대해서 수업 더 들으시면 이해 확실히 되실거에요~

mj K님의 프로필 이미지
mj K

작성한 질문수

질문하기