본문 바로가기

분류 전체보기

(308)
23.01.27 - 문자열 함수, 구조체 문자배열 = char const* (상수) 요소를 바꿀 수 있고 가리키는 것은 바꿀 수 없다 문자열 상수 = const char* (읽기 전용 포인터) 요소를 바꿀 수 없지만 가리키는 것은 바꿀 수 있다. 문자열 함수 strcpy - 문자열 복사 strlen - 문자열 길이 계산 널문자는 길이에 포함 안한다(sizeof는 포함) strcmp - 문자열 비교 두 문자열이 일치할 경우 0, 불일치시 1 strcat_s - 문자열 결합 구조체 배열과 같은 블록단위 데이터로 중괄호로 초기화가 가능하다. 구조체는 멤버 변수 중 가장 큰 자료형을 가진 멤버를 기준으로 메모리 블록을 만든다. struct tagInfo { char c; short s; int i; } sizeof(tagInfo)는 8바이트다. 멤버 ..
23.01.25 - 시간 복잡도, 이차원 배열과 포인터, 함수 포인터 시간복잡도 입력값에 따라 연산을 할 때 시간이 얼마만큼 걸리는지 표현한 것 Big-O 표기법 시간복잡도를 표현할 때 가장 많이 사용하는 방법으로 최악의 경우를 고려해 실행 시간을 계산한다. 최선을 고려하는 빅 오메가, 평균을 고려하는 빅 세타도 있다. Big-O로 표기하는 방법은 먼저 식에서 차수가 가장 큰 것만 남기고 계수도 제외하고 차수만 표기하면 된다. ex) 3n^3 + 2n^2 + 1 => O(n^3) 상수 시간 복잡도 O(1) 개수가 아무리 많아져도 처리하는 시간은 같다. 로그 시간 복잡도 O(logN) 요소의 개수가 적을 때 더 빠르고 개수가 많아져도 일정 지점에서 처리하는 시간이 더 커지지 않기 때문에 효율이 좋은편 선형 시간 복잡도 O(N) 요소의 개수가 많아질수록 정비례로 처리 시간이 ..
23.01.20 - const와 포인터, 배열 읽기 전용 포인터 const int* p - p가 가리키고 있는 공간의 값을 상수화한다. *p로 읽는 것은 가능하지만 *p = 20처럼 쓰는 것은 불가능하다. 상수 포인터 int* const p - 하나의 주소만 참조 가능하다. 선언과 동시에 초기화해야 하며 그렇지 않으면 쓰레기 값으로 초기화 된 후 바꿀 수 없다. 읽기 전용 상수 포인터 const int* const p - 위 두가지 특성을 모두 갖고 있는 포인터이다. 배열은 블록 단위 데이터이다. 블록 단위 데이터는 메모리를 할당할 때 연속된 공간에 블록처럼 차곡차곡 할당하며 초기화 시 중괄호를 이용한다. 배열 이름은 배열의 시작주소를 가리키는 상수 포인터이다. iArray[N] = *(iArray+N) (O) iArray++ (X) 배열이름은 우변..
23.01.19 - 포인터 기초 기존에 변수를 선언해서 메모리에 접근하는 것을 이름으로 접근하는 것이라고 하면 포인터 변수는 주소로 접근하는 것이라고 할 수 있다. 왜 포인터를 이용해야 하냐면 전역 변수는 한 파일에서만 이용 가능하기 때문에 C++에서 이름으로 접근하는 것에 대한 한계가 있기 때문이다. 이 메모리 주소는 실제 메모리 주소는 아니고 OS가 가상 메모리 주소를 실제 메모리 주소와 매칭시켜 준 것이다. 0번지는 접근할 수 없는 null포인터의 주소이며 32비트에서 0x1 ~ 0xffffffff 로 주소를 표현할 수 있다. 주소를 1바이트 단위로 표현하며 주소의 크기가 32비트니까 2의 32승, 4GB 까지 표현이 가능하다. (주소가 1증가할때 마다 1비트가 아니라 1바이트가 커지는 것이다. 헷갈려서 강조표시) 64비트는 2의..
23.01.18 - 메모리2, 함수, 정적 변수(static) BSS BSS는 데이터 영역 밑에 있는데, 데이터 영역의 초기화 된 변수들은 데이터 영역에, 초기화 되지 않은 변수들은 BSS에서 0으로 초기화 한 후에 다시 데이터 영역으로 옮겨진다. 힙 데이터가 위에서 밑으로(낮은 주소에서 높은 주소로) 채워진다. 스택과 마찬가지로 넘치면 오버플로우가 발생할 수 있다. 스택 데이터가 밑에서 위로(높은 주소에서 낮은 주소로) 채워진다. 후입선출의 방식으로 가장 마지막에 들어간 요소가 가장 먼저 나온다. 함수 선언부와 정의부 컴파일러가 코드를 위에서 밑으로 읽기 때문에 아직 읽지 않은 함수를 모를 수 있다. 그래서 기본적으로 함수의 선언부를 위쪽에 작성하고 정의부를 작성하는 것이 좋다. 선언부는 맨 처음 한번 초기화하고 그 후로 호출할 때는 정의부가 사용되기 때문에 디폴..
23.01.17 - 메모리 참고자료로 주신 책에 적혀있는 컴퓨터 구조와 CPU를 정리했다. https://cppking.tistory.com/190 [CS] 컴퓨터 구조와 CPU 메인 메모리 (RAM) 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역 프로그램을 다운 받으면 하드디스크에 저장되지만, 실행하면 프로그램이 메인 메모리에 올라간다. 입출력 버스 (I/O cppking.tistory.com 프로그래밍에서 우리가 보통 사용하는 메모리는 메인 메모리(RAM)이다. 메모리는 4개의 영역으로 나누어진다. 코드(Code) 우리가 작성한 코드를 이진수로 변환해 저장한다. 데이터(Data) 전역 변수와 정적 변수(static)가 저장된다. 컴파일 시 메모리를 할당하고 프로그램이 종료될 때 메모리를 반환한다. 힙(Heap) 사용자..
[CS] 컴퓨터 구조와 CPU 메인 메모리 (RAM) 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역 프로그램을 다운 받으면 하드디스크에 저장되지만, 실행하면 프로그램이 메인 메모리에 올라간다. 입출력 버스 (I/O Bus) 컴퓨터 구성요소 사이에서 데이터를 주고 받기 위해 사용되는 경로 데이터 종류와 역할에 따라 어드레스 버스, 데이터 버스, 컨트롤 버스로 나뉨 CPU 내부 ALU(Arithmetic Logic Unit) CPU에서 실제 연산을 담당하는 블록 대부분은 산술연산(+-*/...)과 논리 연산(AND, OR)으로 이루어진다. CU(Control Unit) CPU가 처리해야 할 명령어들을 해석 명령어가 CPU 내부로 흘러들어가면 2진수로 구성되어있는 명령어를 ALU가 이해할 수 있게 해석한다. 레지스터 CPU 내부에..
23.01.16 - 디버깅 고급 수업시간에 배운 것은 do while, for문이 다여서 정리를 안 했었는데 참고자료로 받은 디버깅 책에 좋은 팁들이 많아서 정리한다. F9 - 중단점 설정 F10 - 프로시저 단위 실행 코드를 보이는 그대로 실행한다. F11 - 한 단계씩 코드 실행 함수를 호출하고 그 함수 내부로 들어가 한줄씩 실행한다. Ctrl + F10 - 커서까지 실행 중단점을 설정하지 않고 바로 특정 위치까지 실행하다 멈출 수 있다. 다음에 실행될 문 변경 디버깅 도중 현재 부분의 앞부분을 한 줄씩 실행하려고 할 때 중단점을 원하는 지점까지 드래그하면 다음에 실행된 문을 변경할 수 있다. 이미 실행된 부분의 결과는 사라지지 않고 그대로 있기 때문에 주의해야 한다. 포인터 배열의 내용 보기 포인터 배열은 배열과 달리 첫번째 요소..