• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

연습문제(문자열)#2 질문있습니다.

21.12.27 14:31 작성 조회수 96

0

#include <iostream>

using namespace std;

//문제2 문자열 복사 함수

char* StrCpy(char* dest, char* src)

{

int i = 0;

while (src[i] != '\0')

{

dest[i] = src[i];

i++;

}

 

dest[i] = '\0';

 

return dest;

}

int main()

{

const int BUF_SIZE = 100;

 

char a[BUF_SIZE] = "Hello";

char b[BUF_SIZE] = "World";

 

StrCpy(b, a);

cout << b << endl;

}

안녕하세요 강사님

최근 연습문제 풀다가 질문있어서 올리게 되었는데요, 3가지 질문드립니다.

질문1

함수 char* StrCpy(char* dest, char* src) 부분에서 함수 자료형이 char*이면 return을 받을때 &rest가 아닌 그냥 rest받는 이유를 알려주세요. 혼자 계속 고민하다가 도저히 모르겠어요 ㅠㅠ

질문2

함수  char* StrCpy(char* dest, char* src)에서 매개변수가 char* 되어있으면 StrCpy(b, a)가 아닌 StrCpy(&b, &a)로 받아야되는 것아닌가요?

질문3

마지막으로 cout << b << endl;에서 b를 출력하면 b[0]만 출력하는줄 알았는데 나머지 배열 전체값이 출력되는 원리 좀 알려주세요.

 

끝으로 제가 강사님 강의 듣고 많은 도움이 되고 있는데 c++은 사실 이번이 처음이어서 그런지 많은 어려움이 있습니다. 특히 포인터로 들어가면서 더더욱 힘들더라구요ㅜㅜ 포인터 부분 어떻게 극복하면 좋은지 약간의 조언좀 해주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

0

포인터는 누구한테다 어렵습니다 ㅎㅎㅎ
제 경우 어셈블리 언어를 공부하니 저절로 포인터를 이해하게 되었는데요.
그 전엔 C++ = 포인터 = 코딩 = 극혐 공식이 성립했었고
대학교 때 코딩에 흥미를 못 느끼고 스타2 + 디아3 + 와우만 열심히 한 이유이기도 합니다

질문1) &dest가 아닌 dest를 반환하는 이유

char*는 [주소값을 담는 바구니인데, 주소를 타고 가면 char가 있을 것]이라는 의미라 했죠?
dest 타입 자체가 char* 타입이고 반환할 타입도 char*이기 때문에,
별도로 주소를 추출할 필요 없이 dest 자체가 [주소값]입니다.
&dest를 하게 되면 char** 타입이 되며
char**이란 [주소값을 담는 바구니인데, 주소를 타고 가면 char* 즉 주소값이 있다]는 의미가 됩니다.

질문2) char* dest, char* src에서 매개변수가 char*이니 왜 StrCpy(&b, &a)가 아니냐?

역시 타입을 일치시켜줘야 하는데요.
char a[BUF_SIZE] = "Hello";
char b[BUF_SIZE] = "World";

에서 a, b 즉 [배열의 이름은 곧 배열의 시작 주소이다]라는 법칙에 의해
a, b 는 char* 타입입니다. 따라서 1과 마찬가지로 이미 타입이 일치하기 때문에
&a, &b를 해줄 필요도 해서도 안됩니다. &a, &b는 char**이 되기 때문이죠.

질문3)
cout의 operator<<가 그렇게 overloading 되어 있습니다.
크게 중요한 부분은 아니라 넘어가셔도 됩니다.

[배열의 이름은 곧 배열의 시작 주소이다]라고 하셨는데, 그럼 dest는 &dest[0]으로 바꿔 쓰거나  StrCpy(b, a);는  StrCpy(&b[0], &a[0]); 으로 바꿔써도 되는 건가요? 실제로 둘다 후자로 바꿔쓰고 비주얼 스튜디오로 디버깅해보니 똑같이 'Hello'로 나옵니다.

#include <iostream>
using namespace std;
//문제2 문자열 복사 함수
char* StrCpy(char* dest, char* src)
{
	int i = 0;
	while (src[i] != '\0')
	{

		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';

	return &dest[0];

}

int main()
{
	const int BUF_SIZE = 100;

	char a[BUF_SIZE] = "Hello";
	char b[BUF_SIZE] = "World";

	StrCpy(&b[0], &a[0]);

	cout << b << endl;
}

네 정확히 이해하셨습니다. 실제로 저렇게 쓰는 경우도 있습니다.

감사합니다 ㅠㅠ