목록C++ (40)
안선생의 개발 블로그

지금까지에 배열은 저렇게 선언해서 사용하였다. 만약에 변수를 이용해서 사용하면 어떻게 될까 분명히 같은 뜻인데 에러가 난다. 그 이유는 변수이기 때문에 a에값이 바뀔 수 있기 때문에 즉 런타임중에 알 수 있기 때문이다. 그때 사용할 수 있는게 가변배열이다 가변배열은 실행도중에 배열에 개수를 내가 원하는데로 선언할 수 있다. 객체(Instance) int가 자료형일경우 int a; a가 객체라고 할 수 있다. 가변배열 만들기 b.h 헤더파일 b.cpp 소스파일 main 소스파일 (*pArr).pint == pArr->pint 정렬 함수 추가해보기 랜덤함수를 사용하여 숫자가 랜덤으로 나오게 한다음 만든 소트 함수로 정렬 main b.cpp while문으로 반복을 계속하는 이유는 33을 오른쪽으로 보냈지만 아..

동적할당 프로그램이 실행되는 런타임동안 사용자가 직접 공간의 크기나 시점을 결정하여 힙 영역의 메모리를 할당 받는것을 동적할당 이라고 한다. 사용자에 의해 메모리가 동적으로 할당이 되면 프로그램이 끝날 때 까지 유지되므로, 메모리 공간 사용이 끝나면 메모리 낭비를 줄이기 위해 명시적으로 메모리 할당을 해제 해주어야한다. 즉 프로그램이 실행 됐을 떄 내가 원하는 만큼 메모리를 요청할 수 있는것을 말한다. 말록으로 이용하여 동적할당 동적할당 1. 런타임 중에 대응이 가능해야함 2. 사용자가 직접 관리해야함(해제) 힘 메모리를 만약에 쓴다면 free를 이용하여 해제해줘야한다. 안그러면 메모리가 부족현상으로 이루어지기 떄문에 해제를 해줘야함. 그렇기 때문에 프로그래머가 관리를 해줘야한다. 출처 : https:/..

char형은 1byte형이므로 표현할 수 있는 숫자가 127개 마꺠 없다. 아스키코드를 보면 실제로 127개까지 마깨 없다. 그러면 한글같은거는 char형으로는 표현 할 수 가 없다. 그래서 2바이트인 wchar형을 써준다. wchar_t wc = L'a';; // 앞에 L을 붙여 2바이트를 쓴다는것을 알려준다. 배열 사용법 wchar_t wc[10] = L"abcdefghi"; // 마찬가지로 앞에 L을 붙여줌 a b c d e f g h i 0 2바이트로 10개 만들었다. 문자는 9개지만 9개 선언하면 에러가 난다. 왜냐하면 끝에 0이 끝난다고 알려주므로 9개 선언하면 에러가 남 0까지 포함하니 잘 생각하자. const wchar_t* pchar = L"abcdefg"; // 문자도 포인터로 사용할 ..

C++ 에서 문자 출력하는 방법 char써서 표현할 수 있다. 1바이트를 사용 char c = 97 // a가 출력됨 이유는 아스키코드로 97이 a이기 때문 아스키코드 참조 숫자를 입력하면 아스키코드 값에 맞는 문자로 바뀜 2바이트 문자형 wchar_t char 은 1바이트 wchar_t는 2바이트를 사용한다. 출처 : https://www.youtube.com/c/AssortRockGameAcademy

Void 반활할 타입이 없다. return 할 필요가 없다. 함수가 값을 반환하지 않음 void pointer 아무 데이터 타입의 주소의 값을 다 받을 수 있지만 역참조가 안된다. 원본의 자료형을 정하지 않아서 역참조를 할 때 어떻게 접근해야 할지 몰라서 역참조가 안된다. 마찬가지로 주소 연산도 불가능 하다. 특징 1. 어떤한 타입의 변수의 주소든 다 저장 가능하다. 2. 역참조 불가능하다. 3. 주소 연산 불가능하다. 그래서 void 포인터를 사용하기 위해선 대입한 데이터형으로 형변환 시킨 후에 사용해야 한다. 왜냐하면 void 포인터가 뭘 가리키는 지 모르기 때문이다. 배열로 해봤습니다. 형변환 후 사용해야 주소 연산 역참조가 가능해진다.! 출처 : https://www.youtube.com/c/As..

상수 값이 변하지 않는 수 앞에 const를 붙여준다. ex) const int a = 10; // a라는 값은 10에서 바뀌지 않음 a = 11; //오류 상수와 포인터 const가 어디에 붙냐에 따라서 달라진다 앞에 붙었을때를 보자 포인터가 앞에 붙으면 포인터가 가르키는 원본의 값을 상수화하여 값을 수정할 수 없지만 다른 주소의 값을 넣을 수 있다. 반대로 뒤에 붙으면 포인터 변수 자체가 상수화 되서 다른 주소의 값을 받을 수 없게 된다. 반대로 원본의 값을 바꿀 수 있다. 이렇게 const를 어디에다 붙이냐에 따라 차이가난다. 두가지 동시에 상수화 주소값을 넣을 수 없고 원본의 값도 바꿀 수 없다. 즉 초기화 시 가리킨 대상만 가리키고, 가리키는 원본을 수정 할 수 없다. 주의 변수 a가 상수화가 ..

포인터 주소를 가르키는 변수 포인터 변수는 처리과정은 정수로 처리한다. 포인터의 주소단위는 byte이다. 포인터를 선언할때 정수를 선언해줘야 한다. 자료형 + *변수명 해당 포인터에게 전달된 주소를 해석하는 단위(자료형) 크기는 전부 32비트 운영체제 4바이트 64비트 8바이트 포인터 선언방법 nullptr : 포인터가 아무것도 가르키지 않는다는 뜻 즉 주소를 안가르킨다. 사용방법 &변수명은 변수명에 주소를 나타냄 pint는 i의 주소값을 넣겠다는 뜻 포인터를 사용하여 변수값 변경 변수명앞에 별을 붙이므로써 주소값을 참조하겠다는 뜻이다. 즉 i의 주소값에 300을 넣겠다는 뜻 포인터는 같은 자료형의 주소만 가능하다. int포인터의 실수값을 저장하면 문법적으로 에러가 발생한다. 그래도 하고싶으면 강제언래핑..

정적변수(static) 변수명앞에 static을 붙여줌,초기화하지 않아도 자동으로 0으로 초기화 된다. ex) static int n; 정적변수는 static뜻 말 그대로 안움직이다 즉 선언된 곳에서만 쓸 수 있다라는 뜻이다. 어디에서 쓰냐에서 따라서 달라진다. 예를 들어보자 main()함수 밖에 선언됐다. 이 뜻은 즉 소스파일(main.cpp)에서 선언됐다라는 뜻이다. 즉 전역변수라고 생각하면 편하다. 위 소스와 같이 main.cpp에서 쓸 수 있으므로 지역변수 처럼 사용 가능하다. 그러면 함수안에 정적 변수를 써보면 어떻게 될까? Test라는 함수를 만들어서 사용해 보았다. 값은 3이 나온다 즉 그뜻은 statci은 지역변수랑 달리 호출 댈때마다 0으로 초기화 시켜주는 것이 아닌 초기값을 0을 주겠다..

분할구현: 헤더랑 파일을 구별하는 것 분할구현하는 이유는 하나의 프로그램을 만들 때 메인 소스파일에다가 다 만들면 코드가 많아져 보기 힘들어짐 그래서 각 기능별로 분할로 나눈다. 헤더 파일을 일단 하나 만들기 b.h라는 헤더파일을 하나 만들었다. 저 코드의 뜻은 add라는 함수가 어딘가의 있다라는 뜻이다. 그러면 add라는 함수의 구현은 어디있는가? 그것은 소스파일 a.cpp에 있을 수도 있고 main.cpp에 있을수도 있다. 우리는 분활로 구현할것이니 a.cpp의 구현을 해보자 a.cpp소스 파일이다. #include "b.h"는 쉽게 말하면 b.h헤더 파일을 a.cpp의 복붙한다고 생각하면 된다. 즉 b.h의 add함수가 있어요 라는 코드가 a.cpp에도 있다고 생각하면 쉽다. a.cpp는 add함수..

지역변수(Local variable) : 지역변수는 함수 내부에서 선언되며 해당 함수가 호출되어 실행되면 생성되었다가 함수가 종료되면 사라지는 변수이다. 해당 범위 내에서만 사용 가능하며 다른 함수에서는 접근이 불가하다. 간단하게 예를 보자 여기서 지역변수는 함수 내부에 선언되있는 코드이다. 그렇다면 함수 a()를 만들어 i++을 해주고 메인 함수로 3번 시키면 3번증가해서 3이 출력될까? 결과는 아니다 지역변수는 스택형식으로 a()함수를 실행하고 1을 메인함수에 주고 소멸하기 때문에 다음 함수를 실행해도 이미 소멸했기 때문에 처음부터 다시 시작한다 그러므로 a();을 실행하면 전부 1이 나오게 된다. 전역 변수(Global variable) : 전역 변수는 함수 외부에서 선언되며 범위(스코프)에 구애받..