본문 바로가기

프로그래밍 언어/C, C++

포인터 vs 참조자 void swap(int *x, int *y) 포인터는 변수의 주소가 파라미터로 전달된다. void swap(int& x, int& y) 참조자는 변수의 Alias가 파라미터로 전달된다. Alias와 파라미터의 주소는 동일하다. 따라서, 참조자의 값 변경시 전달된 변수의 값 또한 바뀐다. 차이점) 1. 포인터는 재 할당될 수 있지만, 참조자는 초기화시에 할당되고 재 할당이 안된다. 2. 참조자는 NULL 값을 할당 받을 수 없다. 포인터는 가능하다. 3. 포인터++은 메모리 이동이고, 참조자++은 값 1 증가이다 4. 포인터 변수의 주소와 변수 주소는 서로 다르지만, 참조자 주소와 변수 주소는 서로 동일하다. 5. 포인터는 ->로 멤버에 접근하고, 참조자는 . 로 멤버에 접근한다. 6. 포인터는 *로 역.. 더보기
std::nothrow std::nothrow 는 상수이며, operator new의 인자이다. 동적 할당 시 할당이 불가능하게 되면, 프로그램이 죽지 않고 null pointer를 리턴하게 해준다. 일반적으로 new 오퍼레이터가 동적할 당을 실패하면 bad_alloc 예외가 발생하게 되는데, nothrow를 인자로 사용하면 할당 실패시 null pointer를 반환하게 된다. (예외 처리 구문을 일일이 작성하지 않아서 좋을 듯 싶다) // nothrow example #include // std::cout #include // std::nothrow int main () { std::cout Allocation returned nullpt 출처) https://cplusplus.com/reference/new/nothrow/.. 더보기
fstream 처음 위치로 옮겨서 덮어쓰기 문제 상황 - 본인은 구조체를 파일에 쓰려고 하였다. 파일 스트림 std::fstream fIn({FILE_PATH}, std::ios::in | std::ios::out) 으로 파일을 열었고, 예를 들어 구조체 5개를 썼다. 하지만, 5개가 한번에 쓰여지는 상황은 아니고 (3개 + 2개) 혹은 (1개 + 4개)로 나뉘어서 씌여지는 상황이다. - 이때 구조체는 다음과 같은 순서로 쓰여지는 문제가 발생하였다. 구조체 3개를 쓰고, 파일이 닫힌뒤 다시 열어서 쓰면 구조체 4번째, 5번째가 파일 처음에 위치하게 되었다. 즉, 기존에 쓰였던 파일이 뒤로 밀렸다. struct{4} // 최근에 쓴 구조체 struct{5} struct{1} // 이하 기존에 쓴 구조체 struct{2} struct{3} - 본인은.. 더보기
C++ 파일 입출력 정리 1. 텍스트 파일과 바이너리 파일 2. C++ 파일 입출력 라이브러리 3. C++ 파일 입출력 모드 : 텍스트 I/O 와 바이너리 I/O, 파일 읽기 쓰기 4. 파일 모드 : 텍스트 I/O 와 바이너리 I/O 5. 멤버 함수를 이용한 텍스트 I/O : get(), put(), read(), write() 출처 : 명품 C++ 프로그래밍 (저자: 황기태) 1. 텍스트 파일과 바이너리 파일 파일은 기록되는 데이터 종류에 따라 텍스트 파일과 바이너리 파일로 나뉜다. 오직 글자로만 이루어진 문서 파일이 텍스트 파일이다. 각 글자에 2Byte 바이너리 코드를 부여하여 ASCII/UNICODE 를 만들었다. 공백은 ASCII로 0x20으로 저장된다. 키는 '\r(0x0D)'+'\n(0x0A)' 두 제어 문자로 기록.. 더보기
Unit testing 이란 https://www.jetbrains.com/help/clion/unit-testing-tutorial.html#basics Unit testing tutorial | CLion www.jetbrains.com ※ 본 포스팅은 위의 글을 번역한 것입니다. 1. 유닛 테스트의 장점 1. 코드를 모듈화 해준다. - 단위 테스트를 수행하기 위해서는 코드가 모듈화 되어야 하기 때문에, 단위 테스트를 수행하기 위해서라도 코드를 모듈화하게(혹은 테스트하기 쉽게)(Code Testability) 설계를 하게 된다 2. (테스트) 회귀를 피해준다 - 단위 테스트는 작업의 진전이 있을 때 마다 반복적으로 수행을 한다. 따라서, 계속 적으로 작업이 옳은 방향으로 나아갈 수 있게 도와준다. 3. 코드를 문서화 해준다. -.. 더보기
void 포인터 용법 정리 Free void pointer Q. void *로 참조된 배열 혹은 구조체를 Free 하는 것은 괜찮을까? A. Malloc과 Free는 항상 void* 를 취하므로 void* 포인터 참조된 것을 해제 하는 것은 자연스러운 일이다. 즉, Free는 void*를 취한다(take). void ** 사용법 void**는 포인터의 포인터이다. 아래의 예시에 따르면 자료형을 알수 없는(some_type_t) 배열을 참조할 때, 해당 배열을 (void *)로 캐스팅 한 후에, (void **)형인 array로 아래와 같이 접근할 수 있겠다. some_type_t 배열이 2차원 배열이라면, void** array 를 이용해 행(row) 접근을 한다고 볼 수도 있겠다. void** array; int arrayLen.. 더보기
Two pointer as argument 예시) #include #include void My_Func1(int *p) { int val = 100; int *Ptr = &val; p = Ptr; //실제로 이렇게 사용하진 않는다. 예시 일뿐. } void My_Func2(int *p) { int val = 100; p = &val; //실제로 이렇게 사용하진 않는다. 예시 일뿐. } void My_Func3(int *p) { *p = 100; //포인터가 가리키는 값을 변경한다(화살표는 그대로) } void My_Func4(int **p) { int val = 200; *p = &val; //포인터 화살표가 변경된다 } void My_Func5(int **p) { int val2 = 300; int *Ptr = &val2; *p = Ptr; .. 더보기
서식 지정자 및 출력 포맷 서식 지정자 형식 : %[플래그][폭][.정밀도][길이] // 정수 printf("%u\n", 10); // 10: 부호 없는 10진 정수 printf("%d\n", -20); // -20: 부호 있는 10진 정수 printf("%i\n", -20); // -20: 부호 있는 10진 정수 printf("%o\n", 071); // 71: 부호 없는 8진 정수 printf("%x\n", 0xF1); // f1: 부호 없는 16진 정수(소문자) printf("%X\n", 0xF1); // F1: 부호 없는 16진 정수(대문자) // long, long long 정수 printf("%lu\n", ULONG_MAX); // 4294967295: 부호 없는 long printf("%ld\n", LONG_MAX);.. 더보기