251210 TIL - C++ 4일차
2025. 12. 10. 20:45ㆍ언리얼 7기 본캠프
오늘은 1-4회차를 보며 C++에서 가장 중요한 개념이라고 할 수 있는 포인터와 레퍼런스에 대해서 학습함
튜터님들도 그렇고 지금까지 배우면서도 몇번이고 중요하고 어려운 개념이라는것을 학습받았기에 오늘은 특히나 포인터에 집중해서 학습을 했음
중간중간에 이해 안되는거나 추가로 궁금한게 있으면 Gemini에게 계속해서 보충설명을 요구했고, 또한 과제를 요청하면서 계속 쓰고 지우고를 반복하며 숙달을 거쳤음
금일 작성한 코드를 첨부함
내일은 개인사정으로 쉬는날이기 때문에 가급적이면 오늘 클래스까지 진도를 나가고 싶었으나 그냥 포인트에 집중하기로 했음
#include <iostream>
using namespace std;
void PrintNumber(int* pNumber) {
for (int i = 0; i < 10; i++) {
cout << *(pNumber + i) << endl;
}
}
int main() {
int numbers[10] = { 1,2,3,4,5,6,7,8,9,10 };
PrintNumber(numbers);
return 0;
}
#include <iostream>
using namespace std;
void SwapByPointer(int* pA, int* pB) {
if (pA == nullptr || pB == nullptr) { // 두 포인터중 하나라도 주소가 없을 경우
cout << "포인터에 주소가 없습니다" << endl;
return;
}
int token = *pA;
*pA = *pB;
*pB = token;
}
void SwapByReference(int& refA, int& refB) {
int token = refA;
refA = refB;
refB = token;
}
int main() {
int a, b;
cout << "첫번째 숫자 입력 : ";
cin >> a;
cout << "두번째 숫자 입력 : ";
cin >> b;
cout << "기본 숫자 : " << a << "," << b << endl;
SwapByPointer(&a, &b);
cout << "포인터 교체 후 : " << a << "," << b << endl;
SwapByReference(a, b);
cout << "레퍼런스 교체 후 : " << a << "," << b << endl;
return 0;
}
이하는 Gemini에게 직접 물어서 과제를 받아 푼 내용과 코드임
[Lv.1] 기초: 스파이 미션 (포인터 기본)
📌 요구사항
- int target = 1000; 변수 생성.
- int* ptr 포인터 변수에 target의 주소 저장.
- 오직 ptr만을 이용하여 target의 값을 9999로 변경.
- 변경된 값 출력.
💻 작성 코드
C++
int main() {
int target = 1000;
int* ptr = ⌖
*ptr = 9999; // 포인터로 값 변경(역참조)
cout << target;
return 0;
}
[Lv.2] 배열: 징검다리 건너기 (포인터 연산)
📌 요구사항
- int arr[5] = { 10, 20, 30, 40, 50 }; 생성.
- int* ptr에 배열의 첫 주소 저장.
- 배열 인덱스([])를 사용하지 않고, 포인터 연산(*(ptr + i))을 이용해 모든 값 출력.
💻 작성 코드
C++
int main() {
int arr[5] = { 10, 20, 30, 40, 50 };
int* ptr = arr;
for (int i = 0; i < 5; i++) {
cout << *(ptr + i) << endl; // 주소를 이동하며 값 참조
}
return 0;
}
[Lv.3] 함수: 대장장이의 강화 (Call by Address)
📌 요구사항
- void PowerUp(int* ptr) 함수 작성 (받은 주소의 값을 +10 증가).
- main에서 int weapon = 100; 생성.
- 함수를 통해 weapon의 공격력을 110으로 증가시키고 출력.
💻 작성 코드
C++
void PowerUp(int* ptr) {
*ptr += 10; // 원본 주소로 찾아가서 값 수정
}
int main() {
int weapon = 100;
PowerUp(&weapon); // 주소 전달
cout << weapon;
return 0;
}
[Bonus] 문자열: 탐색기 (문자열의 끝 찾기)
📌 요구사항
- const char* str = "Hello World"; 문자열 포인터 사용.
- string 객체나 .length() 함수 없이 반복문으로 한 글자씩 출력.
- 널 문자(\0)를 만나면 종료.
💻 작성 코드
C++
int main() {
const char* str = "Hello World";
int count = 0;
while (true) {
if (str[count] == '\0') { // 문자열의 끝 확인
break;
}
cout << str[count] << endl;
count++;
}
return 0;
}
[Lv.4] 응용: 고대 문서 복사 (strcpy 구현)
📌 요구사항
- MyCopy(char* dest, const char* src) 함수 작성.
- src의 내용을 dest로 한 글자씩 복사.
- 복사가 끝난 후 dest의 맨 끝에 **널 문자(\0)**를 반드시 직접 삽입.
💻 작성 코드
C++
void MyCopy(char* dest, const char* src) {
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0'; // 문자열 종료 표시 필수!
}
int main() {
char original[20] = "I am Pointer";
char copy[20];
MyCopy(copy, original);
cout << copy << endl;
}
[Lv.5] 심화: 거울의 방 (문자열 뒤집기)
📌 요구사항
- Reverse(char* str) 함수 작성.
- 새로운 배열 사용 금지 (In-place Swap).
- 시작 포인터(str)와 끝 포인터(end)를 사용하여 양쪽에서 조여오며 교체.
- 문자열 길이에 상관없이 작동하도록 구현 (str < end 조건 활용).
💻 작성 코드
C++
void Reverse(char* str) {
char temp;
char* end = str;
// 1. 끝 포인터 위치 찾기
while (*end) {
end++;
}
end--; // '\0' 바로 앞 글자로 이동
// 2. 두 포인터가 만날 때까지 교체 진행
while (str < end) {
temp = *end;
*end = *str;
*str = temp;
str++;
end--;
}
}
int main() {
char word[] = "Desrever";
Reverse(word);
cout << word << endl;
return 0;
}
[Lv.6] 최종: 공백 분쇄기 (Two Pointer 알고리즘)
📌 요구사항
- RemoveSpace(char* str) 함수 작성.
- 문자열 내의 모든 공백을 제거하고 글자들을 앞으로 당김.
- read(읽기용), write(쓰기용) 두 개의 포인터를 활용.
- 새로운 배열 사용 금지.
💻 작성 코드
C++
void RemoveSpace(char* str) {
char* read = str;
char* write = str;
while (*read) {
if (*read != ' ') { // 공백이 아닐 때만
*write = *read; // write 위치에 기록
write++; // write 한 칸 전진
}
read++; // read는 항상 전진
}
*write = '\0'; // 끝부분 찌꺼기 처리 (새로운 종료 지점)
}
int main() {
char text[] = "H e l l o W o r l d";
RemoveSpace(text);
cout << text << endl;
}
'언리얼 7기 본캠프' 카테고리의 다른 글
| 251216 TIL - C++ 7일차, 새로운 과제 하달 (1) | 2025.12.16 |
|---|---|
| 251215TIL - C++ 6일차 - 과제 제출 (0) | 2025.12.15 |
| 251209 TIL - C++ 3일차 (0) | 2025.12.09 |
| 251208 TIL - C++ 2일차 (0) | 2025.12.08 |
| 251205 TIL - 챕터2 C++ 1일차 (0) | 2025.12.05 |