inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

6.7 포인터의 기본적인 사용법

for 문 사용 시 array 복사

551

yoy06118

작성한 질문수 8

1

c++

답변 1

3

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

어떤 함수의 매개변수와 함수 안에서 정의된 변수들은 해당 함수의 지역 변수로 취급됩니다.

따라서, 해당 함수가 호출될 때 마다 함수의 매개변수에 대한 복사가 이루어지고, 함수 호출이 종료되어 지역 범위가 소멸될 때 까지 유지됩니다.

이 과정에서 이루어지는 복사로 이해하시는 것이 적절할 것 같습니다.

관련 내용에 대한 설명은 강의 6.2 배열 기초 [2 of 2] array 의 전체 부분을 참고하시면 좋을 것 같습니다.

함수의 매개 변수를 통하여 배열을 전달할 때, 배열 전체를 복사하여 전달하는 것이 아니라, 배열의 이름이 가리키는 배열의 시작 원소의 주소 만을 전달하여 보다 효율적인 메모리 관리를 가능하게 해주는 것입니다.

 

2

yoy06118

답변 감사합니다. 하나 궁금한 부분이 일반적인 자료형을 쓴 함수에서는 파라미터를 배열을 그대로 사용하던지, 포인터로 바꿔서 사용하던지 함수 내에서 sizeof를 이용해 출력하면 같은 크기인 4를 가지는 것을 확인할 수 있었습니다. 설명해주신 경우는 함수의 파라미터로 struct나 class를 사용할 때 의미가 있는 것인가요?

아니면 함수의 파라미터로 배열을 사용하면 전달될 때는 배열의 크기였다가, 복사되는 과정에서 주소의 크기로 줄어드는 것인가요?

2

홍정모

수박님께서 잘 대답을 해주셨는데, 부연 설명을 드린다면

제가 데이터를 통째로 복사해서 인수로 넘기는 것 보다 포인터만 넘기는 것이 좋다고 언급한 것은 C++ 언어의 설계 관점에서 말씀드린 것입니다. 왜 어렵게 포인터를 사용하냐, 배열 이름을 왜 포인터로 바꿔서 헷갈리게 만드냐 등 문법이 왜 이렇게 되어 있느냐에 대한 대답입니다.

따라서

"설명해주신 경우는 함수의 파라미터로 struct나 class를 사용할 때 의미가 있는 것인가요?"

는 정확하게 이해하신 것으로 보입니다. (여러 데이터를 묶어 놓고 넘기면서 복사가 되는 상황)

만약 의도적으로 배열을 통째로 복사를 하고 싶으실 때는 std::vector 같은 컨테이너를 포인터나 참조를 사용하지 않고 value로 넘겨버리면 내부적으로 배열 데이터를 모두 다 복사를 해주도록 구현되어 있습니다.

1

yoy06118

교수님 한가지 더 궁금한 부분이 그러면 배열 대신 포인터를 사용할 경우 속도가 더 빠른 경우는 어떤 경우가 존재하나요? 함수의 파라미터로 사용하거나, for 문을 이용해서 배열을 출력할 때 모두 같은 속도인데, 언제 포인터가 배열보다 속도의 이점을 가지는지 궁금합니다.

1

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

우선 제가 조심스레 답변을 드리자면, 질문에 대한 댓글로 새로운 질문을 하는 것은 사실 질문자가 확인하기 어렵습니다. 따라서, 추가적으로 궁금하신 사항이 생기시면 새롭게 질문을 올리시는 것을 권장드립니다.
(공지사항의, "질문에서 답 잘 받는 요령을 정리한 글입니다. 질문하시기 전에 꼭 클릭해서 보세요. (링크)" 참고)

제가 조심스럽게 답변을 해보자면 다음과 같습니다.

교수님께서 말씀해주신 대로, 'C++ 언어의 설계 관점' 을 주요 기준으로 바라보시는 것이 보다 적절한 것 같습니다.
질문자님께서 말씀하신 것 처럼, 배열과 포인터 둘 다 메모리 주소를 기반으로 동작하기 때문에 속도 상에서 큰 차이를 보이는 경우는 적습니다.
따라서, 기본적인 연산 속도의 차이보다는 '데이터 복사의 최소화', '동적 메모리 할당', '유연한 데이터 구조' 등의 장점을 바탕으로 'C++ 언어의 설계 관점' 에서 포인터 사용의 '성능상의 이점' 을 바라보시는 것이 적절한 것 같습니다.

강의자료는 어디서 받을 수 있죠?

1

25

2

교재 있나요?

1

140

2

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

1

93

3

using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다

1

103

2

cstr직접구현

0

117

3

BubbleSort

1

79

2

숙제 마지막 부분

1

80

2

강의와 똑같이 진행했는데 링킹 에러가 발생합니다.

1

96

2

수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??

1

165

2

공변반환형 관련 문의 드립니다.

1

92

2

170강 유니크 포인터에대해 질문있습니다

1

82

1

섹션 5 퀴즈의 답이 이상합니다

1

85

2

이중포인터와 배열이 이해가 안됩니다.

1

159

2

5분 17~5분 34초 객체 잘림 질문

1

80

1

Resource.h 코드 알려주세요

1

74

1

char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다

1

95

2

화면좌측 숫자 보이기

1

116

1

화면 좌측 숫자 보이기

0

68

1

처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??

1

139

3

46강 string 버퍼 질문입니다

1

82

2

프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.

1

125

2

[] 범위 검사시 assert 사용 관련 질문

1

92

2

Lecture 클래스 멤버변수 명명 관련

0

93

2

프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요

0

75

1