해결된 질문
작성
·
143
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'로 나옵니다.