C++프로그래밍/C 와 C++ 기초실습 25

문자열(포인터) 연습해보기

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. 1) 문자열 길이 번환int StrLen(const char* str){ int cnt = 0; while (*(str+cnt) != '\0') { cnt++; } return cnt;}ㆍ 간단하게 문자열의 길이를 반환하는 함수. \0을 만나기 전까지 반복문을 돌려준다. 2) 문자열 복사- 포인터를 이용한 방식으로 해볼 예정이다.char* StrCpy(char* dest, char* src){ char* ret = dest; while (*src != '\0') { *dest = *src; *dest++; *src++; } *dest = '\0'; return ret;..

배열과 포인터 (차이점 및 다중 포인터) + 포인터 주의 사항

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다.▶ 배열과 포인터의 차이점 (사람들이 같다고 착각하는 이유)1) 포인터int* p;ㆍ p는 단지 그곳으로 워프하는 포탈이라 생각하자 ㆍ 진퉁은 쩌~~~ 멀리 어딘가 있음 ㆍ p는 그저 주소를 담아주는 바구니일뿐 (4or8바이트) 2) 배열int arr[10];ㆍ 진짜배기 원조 데이터가 이 안에 진짜로 있는거임. (얘 자체가 진퉁 데이터) ㆍ 포인터는 그냥 4or8바이트 작은 데이터(포탈) 인 반면, 배열은 진짜 거대할 수도 있음 ㆍ 닭장처럼 데이터의 묶음이기 때문에 많고 거대할 수 있음 ㆍ 배열과 배열의 이름은 다른거다. 배열의 이름은 그저 첫번째 주소를 가리키고 있는놈이다. ..

다중 포인터 (const char**) 문자열

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. void SetMessage(const char* a){ a = "Bye";}int main(){ const char* msg = "Hello"; SetMessage(msg); //안된다.. 그대로 Hello가 출력된다 cout ㆍ 편의를 위해 스택 프레임을 텍스트로 표현해 보겠다. 앞에서부터가 높은주소다. 위코드를 해석하자면..텍스트 예시 -   [매개변수] [RET] [지역변수]  [매개변수] [RET] [지역변수] 1)    [매개변수] [RET] [지역변수(msg(Hello주소))]  [매개변수] [RET] [지역변수]ㆍ msg는 스택영역 지역변수로 Hello주소..

배열과 포인터 (문자열)

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ▶ 배열int a=10; //바구니int b = a;ㆍ 여태 사용하던 변수들의 [이름]은 바구니의 이름이였다. ㆍ 하지만 배열은 [이름]이 좀 다르게 동작한다.struct StatInfo{ int hp = 0xAAAAAAAA; int attack = 0xBBBBBBBB; int defence = 0xDDDDDDDD;};int main(){ //배열의 크기는 상수여야 한다. VC컴파일러 기준 const int monsterCnt = 10; StatInfo monsters[monsterCnt]; StatInfo Players[10];// players = monsters; 이건..

포인터와 참조타입 비교,차이 (const pointer)

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ▶ 포인터vs참조 ㆍ 성능은 똑같다. 편의성은 참조가 더 좋다.  1) 편의성 관련 ㆍ 편의성이 좋다는게 꼭 장점만은 아니다. ㆍ 포인터는 주소를 넘기니 확실하게 원본을 넘긴다는 힌트를 줄 수 있다 (가독성, 사람이 확인하기 눈에 확들어옴) ㆍ 참조는 자연스럽게 모르고 지나칠 수 있음! (협업하기 힘들수도) ㆍ 나같은 신입이 마음대로 고쳐버릴 수도 있음 (const로 막아줄 수 있긴 함) ㆍ 따라서 편리하게 넘겨주기 전용이며 데이터 수정이 없는 &에는 const를 붙히자. ★ 포인터도 const를 사용 가능하다. ▷  * 앞에 붙히느냐 * 뒤에 붙히느냐에 따라 의미가 달라진다..

참조타입

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ▶ 변수를 전달하는 방식을 살펴보자 1. 값 전달 방식void PrintInfoByCopy(StatInfo info){ cout ㆍ 값 전달 방식은 지난 시간에 살펴봤듯 복사가 일어난다.  ㆍ 무언가를 return을 해주거나 하는것이 아니라면 실제 원본 객체엔 영향을 주지 않는다. ㆍ 어셈블리로 확인해봐도 바로 알 수 있다. (지난 포스팅에서 다뤘으므로 다시 하진 않겠다)  ㆍ 만약 StatInfo가 100000바이트 짜리 구조체였다고 했다면?ㆍ 값 전달 방식은 복사가 100000바이트 만큼 일어나는거다. (성능꾸짐) 2. 주소 전달 방식void PrintInfoByPtr(S..

포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정)

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ▶ 포인터를 이용해 원본 객체를 사용하는 것과 아닌것의 차이점을 실습으로 알아봤다.#include using namespace std;struct StatInfo{ //offset은 int hp; // 0 int attack;//4 int defence;//8}; //4byte3개 12void EnterLoby();StatInfo CreatePlayer(); // 일반버전void CreateMonster(StatInfo* info); // 포인터를 이용한 버전int main(){ EnterLoby();}void EnterLoby(){ cout ㆍ 실습을 편하게 하기 위..

포인터 연산

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ▶ 포인터 연산 1. 주소 연산자 ( & )int main(){ // 주소 연산자 int num = 1; int* pointer = #} ㆍ 해당 변수의 주소를 알려주세요 ㆍ 더 정확히 말하면 해당 변수타입에 따라서 Type*을 반환2. 산술 연산자 ( + -  ) pointer = pointer + 1; pointer++; ++pointer; pointer += 1;ㆍ 다 된다.ㆍ 근데 무슨기능을 할까??ㆍ 간단하다. 그냥 1이 증가했다ㆍ pointer += 1 을 찍어볼거다ㆍ 4만큼 증가했다!!!int main(){ // 산술 연산자 num += 1; //1증가 ..

포인터

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다.    ▶ 포인터   ㆍ 일반 변수는 메모리에 이름을 붙힌 것 int num 이라 붙히면 메모리 공간에 num이라는 이름을 붙혀준 것   ㆍ 포인터는 주소를 저장하는 바구니   ㆍ 포인터 선언 방법 TYPE* 변수이름;   ㆍ 포인터라 함은 주소를 저장하는 타입      ㆍ 포인터 바구니는 4바이트(32비트) or 8바이트(64비트) 환경에 따라 고정이다. (자료형 상관없음) #include using namespace std;int main(){ int number = 1; int* ptr = &number; cout ㆍ 위 코드를 테스트 할 때 메모리 창에 &number을 ..

스택 프레임과 호출스택 (디버그)

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로C++에 대한 구체적인 정보를 담고 있지 않습니다. ㆍ 스택 영역은 용량이 한정되어있고, 이게 초과되면 스택 오버플로우 발생. ※ 디버깅을 해보자 ㆍ 위 사진같은 코드가 있는데 중단점을 저쯤 찍어두고 디버깅을 돌려보자. ㆍ 어셈블리에선 우리가 찾고싶은 함수에 대한 정보는 없다??-> 레지스터 창을 열어주자 ㆍ ESP라고 되어있는게 스택포인터다. ※ 복습 eax ebx... 등등E인건 32비트로 디버깅을 돌리기 때문 (64비트였으면 R) ㆍ 해당 주소를 복사해서 메모리 창을 열어주자ㆍ 메모리에 스택 포인터 주소를 복사해줘서 찍어봤더니 뭔가가 나온다! ㆍ 눈으로 보기 편하게 4바이트 정수로 바꿔주고ㆍ F11버튼을 통해 하나씩 실행..