포인터 변수는 다른 변수의 주소 값을 가진 변수 입니다.
포인터는 * << 입니다.
변수 선언에 붙으면, 이 변수는 포인터 변수입니다.
int num = 10;
int* numPtr = #
num의 주소를 numPtr에 저장한다는 의미!
그 외의 위치에 붙으면, 그 주소로 가면 있는 값을 뜻합니다.
cout << *numPtr << endl;
*numPtr은 그럼 10을 출력하겠네요.
cout << &num << endl;
cout << numPtr << endl;
cout << *numPtr << endl;
위에서 부터 출력을 한번 보겠습니다.

출력이 이렇게 나옵니다.
맨위는 num의 주소값이고, numPtr은 num의 주소값을 담고있으니까 같은 값이 나옵니다.
마지막은 numPtr의 주소에 있는 값을 나타내기 때문에 num의 값을 출력하게됩니다.
그럼 다음 배열에서의 포인터는 어떻게 작동하는지 보겠습니다.
int arr[5];
for (int i = 0; i < 5; i++) {
arr[i] = i;
cout << arr + i /* == &arr[i]*/ << endl;
}
먼저 5칸 크기의 배열을 선언해주고 배열안에 i값을 넣어주겠습니다.
cout << arr + i /* == &arr[i]*/ << endl;
arr안의 값을 출력할려면 arr[i]라고 해야하는데
그럼 이 줄은 무엇을 출력하게 될까요?

보다시피 주소를 출력하게 됩니다.
근데 +i를 했는데 어째서 1이 더해지거나 2가 더해지지 않았을까요?
(16진수를 모르면 16진수를 공부하고 와주세요!)
왜냐하면 arr이 int로 정의되었기 때문에 한 메모리에 4바이트씩 들어가기때문에 한칸에 4칸씩 차이나기 때문입니다.
그래서 한칸에 4씩 차이나기때문에 i가 1일때는 4가 차이나고 i가 2일때는 8이 차이나는 것입니다.
그럼 예제로 뭐가 출력되는지 보겠습니다.
//예제 - 뭐가 출력되는지 알아야함
cout << arr << endl;
cout << &arr[0] << endl;
cout << &arr[1] << endl;
cout << arr << endl;
cout << arr + 0 << endl;
cout << arr + 1 << endl;
cout << *arr << endl;
cout << *(arr + 0) << endl;
cout << *(arr + 1) << endl;

결국 이걸보면 arr + i == &arr[i] 와 같다는 것을 알 수 있습니다.
마지막 3개를 보면 주소로 가면 있는 값인 0 0 1을 볼 수 있습니다.
전체 소스코드 입니다.
#include<iostream>
using namespace std;
int main() {
//포인터 변수 = 다른 변수의 주소값을 가진 변수
// *
// 1. 변수 선언에 붙으면, 이 변수는 포인터 변수이다.
// 2. 그 외의 위치에 붙으면, 이 주소로 가면 있는 값
//
// & 이 변수의 주소이다.
// int* 이 주소로 가면 있는 값의 자료형은 int이다.
int num = 10;
int* numPtr = #
cout << &num << endl; //num의 주소값
cout << numPtr << endl; //num주소값을 넣어으니 주소값이 나옴
cout << *numPtr << endl; //numPtr주소로 가면 있는 값이 나옴
//배열의 이름 = 시작 주소
//그냥 arr 이라고 쓰면 arr 배열의 주소값을 뜻함.
//arr = &arr[0]
//arr+0 = &arr[0]
//arr+i = &arr[i]
//int는 메모리에 4바이트씩 들어가는데 주소값은
//배열 한칸당 4씩 차이난다.
int arr[5];
for (int i = 0; i < 5; i++) {
arr[i] = i;
cout << arr + i /* == &arr[i]*/ << endl;
}
//예제 - 뭐가 출력되는지 알아야함
cout << arr << endl;
cout << &arr[0] << endl;
cout << &arr[1] << endl;
cout << arr << endl;
cout << arr + 0 << endl;
cout << arr + 1 << endl;
cout << *arr << endl;
cout << *(arr + 0) << endl;
cout << *(arr + 1) << endl;
return 0;
}
구조체는 struct로 사용할 수 있습니다.
//구조체
struct Avatar {
string name;
int level;
int hp;
//생성자
Avatar(string _name, int _level, int _hp) {
name = _name;
level = _level;
hp = _hp;
}
};
구조체는 안의 변수들과 생성자로 구성됩니다.
생성자로 다른 함수에서 사용가능합니다.
사용방법은
Avatar player = { "이름" , 1, 100 };
또는
Avatar pet("펫", 1, 50);
로 사용됩니다.
그리고 함수를 만들다보면
void TakeDamage(Avatar &ch, int damage) {
ch.hp = ch.hp - damage;
}
//이름은 같지만 매개변수가 달라서 가능! 함수 오버로딩이라고 부름
void TakeDamage(int a) {
}
//함수 오버로딩은 주로 이렇게 사용한다
int Sum(int a, int b) {
}
float Sum(float a, float b) {
}
이처럼 함수 이름을 같게 사용할 수 있는데 이걸 함수 오버로딩이라고 합니다.
오버로딩은 반환 자료형이 달라도 되고, 안에 변수가 달라도 됩니다.
만약 안의 변수 개수가 같다면 변수의 자료형이 달라져야 합니다.
위의 Sum 처럼이라고 보시면 됩니다.
전체 소스코드 입니다.
#include<iostream>
using namespace std;
//구조체
struct Avatar {
string name;
int level;
int hp;
//생성자
Avatar(string _name, int _level, int _hp) {
name = _name;
level = _level;
hp = _hp;
}
};
void TakeDamage(Avatar &ch, int damage) {
ch.hp = ch.hp - damage;
}
//이름은 같지만 매개변수가 달라서 가능! 함수 오버로딩이라고 부름
void TakeDamage(int a) {
}
//함수 오버로딩은 주로 이렇게 사용한다
int Sum(int a, int b) {
}
float Sum(float a, float b) {
}
int main() {
Avatar player = { "이름" , 1, 100 };
Avatar pet("펫", 1, 50);
player.hp = player.hp - 10;
TakeDamage(player, 10); //어떤 역할인지 가독성도 좋아짐.
cout << player.hp << endl;
//Avatar dog[100];
//기본적으로 큰 배열의 구조체를 쉽게 초기화 하는 방법은 없다.
return 0;
}
재귀함수란? 함수내에서 다시 자신의 함수를 불러와서 반복하는 함수입니다.
//재귀함수
int Sum(int i) {
if (i == 1) {
return 1;
}
return i + Sum(i - 1);
}
예제를 보시면
cout << Sum(5) << endl;
를 실행하게되면 Sum함수가 실행되면서
if문으로 가게되서 i가 1이 아니라서
5 + Sum(4)가 실행되고
Sum(4)은 4 + Sum(3)이므로
결국은 5 + 4 + 3 + 2 + 1 이 되게 됩니다.
int Factorial(int i) {
if (i == 1) {
return 1;
}
return i * Factorial(i - 1);
}
팩토리얼은 5! 이면 5 X 4 X 3 X 2 X 1 이기 때문에
재귀함수로 구현하면 위의 코드처럼 구현할 수 있습니다.
전체 소스코드 입니다.
#include<iostream>
using namespace std;
int Factorial(int i) {
if (i == 1) {
return 1;
}
return i * Factorial(i - 1);
}
//재귀함수
int Sum(int i) {
if (i == 1) {
return 1;
}
return i + Sum(i - 1);
}
int main() {
int num;
cin >> num;
cout << Sum(5) << endl;
cout << Factorial(num) << endl;
return 0;
}