#include <iostream>
#include <stdlib.h>
#include <string>
#include <time.h>
using namespace std;
class Monster{ public: int hp; int damage; int level; };
void main(){
// 정수형 변수 생성
int value1 = 100;
int value2 = 200;
Monster monster;
monster.hp = 100;
monster.damage = 10;
monster.level = 1;
cout << "value1 : " << value1 << endl;
cout << "value2 : " << value2 << endl;
cout << "value1의 메모리 주소 : " << &value1 << endl;
cout << "value2의 메모리 주소 : " << &value2 << endl;
cout << "value1의 메모리 주소를 실체값으로 반환 : " << *(&value1) << endl;
cout << "value2의 메모리 주소를 실체값으로 반환 : " << *(&value2) << endl;
cout << "value1의 메모리 주소를 실체값으로 반환후 다시 메모리주소로 : " << &(*(&value1)) << endl;
cout << "value2의 메모리 주소를 실체값으로 반환후 다시 메모리주소로 : : " << &(*(&value2)) << endl;
cout << "" << endl;
//[ 객체의 메모리 주소]
cout << "monster 객체의 메모리 주소 : " << &monster << endl;
cout << "monster 객체의 hp 맴버변수 메모리 주소 : " << &monster.hp << endl;
cout << "monster 객체의 damage 맴버변수 메모리 주소 : " << &monster.damage << endl;
cout << "monster 객체의 level 맴버변수 메모리 주소 : " << &monster.level << endl;
//[ 메모리 주소의 실체값 ]
cout << "monster 객체의 hp 맴버변수 메모리 주소의 실체 값 : " << *(&monster.hp) << endl;
cout << "monster 객체의 damage 맴버변수 메모리 주소 실체 값 : " << *(&monster.damage) << endl;
cout << "monster 객체의 level 맴버변수 메모리 주소 실체 값 : " << *(&monster.level) << endl;
cout << "" << endl;
//[ monster 객체의 크기(bite) sizeof() 함수 사용 ]
cout << "monster 객체의 크기(bite) : " << sizeof(monster) << endl;
cout << "monster.hp 객체의 hp 맴버변수 크기(bite) : " << sizeof(monster.hp) << endl;
cout << "" << endl;
//[ 메모리 주소를 자료형 변수에 대입 "포인터 변수" ]
int* pvalue1 = &value1;
int* pvalue2 = &value2;
// int*(메모리주소 데이터타입) pvalue2(메모리주소를 담을 변수명) = &value2(메모리주소)
cout << "int* pvalue1 = &value1 : " << pvalue1 << endl;
cout << "int* pvalue2 = &value2 : " << pvalue2 << endl;
cout << "pvalue1 메모리주소 변수의 실체값 : " << *(pvalue1) << endl;
cout << "pvalue2 메모리주소 변수의 실체값 : " << *(pvalue2) << endl;
//[ 객체에 메모리 주소를 저장 하는 포인터 변수]
Monster* pmonster;
pmonster = &monster;
//[ 객체의 맴버 변수에 접근은 arrow 를 쓴다 " -> " ]
cout << "pmonster 메모리 주소값 : " << pmonster << endl;
cout << "monster 메모리 주소값 : " << &monster << endl;
cout << "pmonster 객체의 맴버변수 hp의 실체값 : " << pmonster->hp << endl;
cout << "pmonster 객체의 맴버변수 hp의 메모리 주소 : " << &(pmonster -> hp) << endl;
}
====[ 함수활용 ]==========================================================
#include <iostream>
#include <stdlib.h>
#include <string>
#include <time.h>
using namespace std;
class Monster{
public:
int hp;
int damage;
int level;
};
// 값을 교체 하는 함수1 ( 메모리 주소를 혹은, 포인터 변수를 받는다. )
void swapAdd1(Monster *object1, Monster *object2){
Monster temp = *object1;
*object1 = *object2;
*object2 = temp;
}
// 값을 교체 하는 함수1 ( 포인터 변수를 받는다 )
void swapAdd2(Monster* object1, Monster* object2){
Monster* temp = object1;
object1 = object2;
object2 = temp;
}
// 생성된 객체 몬스터의 데미지를 업그레이드 해줌.
void damageUp(Monster* object1, Monster* object2){
object1->damage += object2->damage;
object2->damage += object1->damage;
}
void main(){
// 객체 생성
Monster monster1;
Monster monster2;
//monster1 객체 맴버변수 값 설정
monster1.hp = 100;
monster1.damage = 10;
monster1.level = 1;
//monster2 객체 맴버변수 값 설정
monster2.hp = 200;
monster2.damage = 20;
monster2.level = 2;
//객체 맴버 변수의 기본값
cout << monster1.hp << endl;
cout << monster2.hp << endl;
//객체 맴버 변수의 교체된 값
swapAdd1(&monster1, &monster2);//메모리 값을 받는 함수 실행
cout << monster1.hp << endl;
cout << monster2.hp << endl;
//객체형 포인터 변수 생성
Monster* pmon1; pmon1 = &monster1;
Monster* pmon2; pmon2 = &monster2;
swapAdd2(pmon1,pmon2); //포인터 변수를 받는 함수 실행
//객체형 포인터 변수로 접근하여 교체된 값.
cout << monster1.hp << endl;
cout << monster2.hp << endl;
//객체 monster 의 기본 데미지 값.
cout << monster1.damage << endl;
cout << monster2.damage << endl;
//객체 monster 의 기본 데미지에 업그레이드 된 값.
damageUp(pmon1, pmon2);//포인터 변수를 받는 함수 실행
cout << monster1.damage << endl;
cout << monster2.damage << endl;
}
=====[ 배열 활용 ]=======================================================
#include
#include
#include
#include
using namespace std;
class Monster{
public:
int hp;
int damage;
int level;
};
// 실체의 값 반환
void printArr(int* arr){
for (int i = 0; i < 5; i++){
cout << i + 1 << "번째 입력받은 배열의 값 " << *(&arr[i]) << endl;
}
}
// 메모리 주소 반환
void printArr2(int* arr){
for (int i = 0; i < 5; i++){
cout << i + 1 << "번째 입력받은 배열의 값 " << &arr[i] << endl;
}
}
// 배열의 값 입력
void InputArr(int* arr, int size){
for (int i = 0; i < size; i++){
cout << i + 1 << " 번째 입력받을 배열의 값";
cin >> *(arr+i);
}
}
void main(){
// 배열의 시작 주소 값.
int arr[5] = { 0, 1, 2, 3, 4 };
cout << "arr[0] : " << arr[0] << endl;
cout << "arr[0] 의 메모리 주소 : " << &arr[0] << endl;
cout << "arr[0] 의 메모리 주소의 실체 값 : " << *(&arr[0]) << endl;
cout << " "<< endl;
// arr 주소에 1을 더하면 하나의 자료형크기(int)를 지칭함
// 배열은 기본적으로 메모리 주소를 가지고 있기 때문에 포인터변로 만들어 줄 필요가 없다.
cout << "arr+1 : " << arr + 1 << endl;
cout << "&arr[1] : " << &arr[1] << endl;
cout << "arr+1의 실체 값 : " << *(arr + 1) << endl;
cout << "&arr[1]의 실체 값 : " << *(&arr[1]) << endl;
// 배열의 크기를 임의 변수로 지정할 때 포인터 변수를 사용해야 값이 적용된다.
// 잘못된 예 ) int size = 5; arr[size] == 안됨
// 맞는 예 ) int* size = 5; arr[size] == 메모리 주소를 사용해야 함.
cout << " " << endl;
int size = 0;
cout << " 할당 크기를 정하세요"; cin >> size;
// 자동변수 공간의 크기는 컴파일 이전에 결정되어야 한다.
int* arr = new int[size];
// InputArr(arr, size);
//printArr2(arr);
}
댓글
댓글 쓰기