a, 'a', "a" 의 차이 a 는 변수입니다.a 라는 변수는 형에 따라서 다양한 값을 입력시킬 수 있습니다.int a; a = 5; a = 'a'; a = '7'; 'a' 는 문자 상수입니다. 상수이기 때문에 'a' 는 변하지 않습니다.시스템 내부적으로 'a' 는 ASCII 수치로 변환되어 처리됩니다. ( 'a' 의 ASCII 의 값은 97 입니다. ) "a" 는 문자열 입니다.문자열은 반드시 널 문자로 끝나도록 정해져 있으므로 "a" 도 역시 '\0' 를 포함하고 있습니다. 문자열 포인터 변수 문자열 포인터 변수는 포인터 변수이기 때문에 변수에 저장되는 값은 주소가 됩니다.이 주소가 가리키는 대상체가 문자열일 때 이것을 문자열 포인터 변수라고 지칭합니다.정확히는 문자열이 저장된 곳의 가장 첫번째 문..
C
포인터란 무엇인가? 포인터는 번지에 대한 기호화된 표현을 의미합니다.즉, 포인터는 번지입니다. 이해가 잘 안될 수 있으므로,int mozi; 라는 변수를 정의합니다. 시스템은 정의를 만나는 순간 mozi 변수에 대해 4 byte 의 메모리를 할당해줍니다.시스템이 할당해준 4 byte 는 다른 프로세스들이 할당받지 못하며, 각 byte 는 모두 이름을 가지는데 이를 번지라고 합니다. 그림으로 표현하면 다음과 같습니다. 결국 포인터라는 것은 메모리의 위치를 표현한 기호를 의미합니다. 포인터 변수 포인터는 메모리의 특정 위치를 가리킨다고 했습니다.그렇다면 포인터 변수는 무엇을 의미할까요?포인터 변수는 포인터를 저장할 수 있는 변수를 말합니다.이 말은, 메모리의 특정 위치를 저장한다는 말과도 동일합니다. 즉, ..
스택 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조 LIFO ( Last In First Out ) 구조로 저장되는 형식을 말합니다.자료를 넣는 것을 Push, 자료를 꺼내는 것을 Pop 이라고 합니다.꺼내지는 자료는 가장 최근에 보관된 자료부터 나오게 됩니다. 스택의 함수 S.top() 스택의 가장 윗 데이터를 넘겨줍니다.만약에 비었다면 이 연산은 정의불가의 상태입니다. S.pop() 스택의 가장 윗 데이터를 넘겨주고 해당 데이터를 스택에서 삭제합니다.스택이 비었다면 연산은 정의불가 상태입니다. S.push() 스택의 가장 윗 데이터로 top 이 가리키는 자리 위에 메모리를 생성한 후 데이터를 넣습니다. S.empty() 스택이 비어있다면 참, 그렇지 않다면 거짓을 반환합니다. 스택의 코드 pop..
큐 먼저 집어 넣은 데이터가 먼저 나오는 FIFO ( First In First Out ) 구조로 저장되는 형식을 말합니다.프린터의 출력, 키보드 입력 등 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에서 사용됩니다. 큐는 Put ( 삽입 ), Get ( 삭제 ) 를 이용하여 구현됩니다.Put 은 큐에 자료를 넣는 것을, Get 은 큐에서 자료를 꺼내는 것을 의미합니다.Front 와 Rear 은 데이터의 위치를 가르키며, Front 는 데이터를 Get 할 수 있는 위치, Rear 는 데이터를 Put 할 수 있는 위치를 의미합니다.큐가 가득차서 자료를 더이상 넣을 수 없는 경우를 오버플로우, 큐가 비어있어 자료를 꺼낼수 없는 경우를 언더플로우라고 합니다. 큐의 종류 및 작동방식 선형과 환형이..
삽입정렬 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입하는 방식입니다.배열이 길어질수록 효율이 떨어지지만, 구현이 간단합니다.시간복잡도는 O(n^2) 입니다. 삽입정렬 알고리즘 1. 두 번째 원소를 부분 리스트에서 적절한 위치에 삽입합니다.2. 세 번째 원소를 부분 리스트에서 적절한 위치에 삽입합니다.3. 위의 작업을 정렬이 끝날때까지 반복합니다. 삽입정렬 예제 25 를 앞의 리스트와 비교하여 적절한 위치에 삽입합니다.3125122211 253112221112 를 앞의 리스트와 비교하여 적절한 위치에 삽입합니다.2531122211 122531221122 를 앞의 리스트와 비교하여 적절한 위치에 삽입합니다.1225312211 122225311111..
선택정렬 첫번째 항목부터 최소값을 탐색하여 교환하며 정렬하는 방식입니다.n 개의 주어진 리스트를 정렬하는데 O(n^2) 만큼의 시간이 걸립니다. 선택정렬의 알고리즘 1. 주어진 리스트 중에 최소값을 찾습니다.2. 찾은 값을 맨 앞에 위치한 값과 교체합니다.3. 맨 처음 위치를 뺀 나머지를 같은 방법으로 교체합니다. 선택정렬의 예제 가장 작은값(0)을 찾은 뒤 가장 좌측값(9)와 교환합니다.9,1,6,8,4,3,2,0 0,1,6,8,4,3,2,9가장 작은 값(1) 을 찾은 뒤 가장 좌측에서 다음번의 위치와 교환합니다. (여기에서는 같은 값이므로 교환되지 않습니다.)0,1,6,8,4,3,2,9가장 작은 값(2) 를 찾은 뒤 그 다음의 좌측값(6)과 교환합니다.0,1,6,8,4,3,2,9 0,1,2,8,4,3..
버블정렬 두 인접한 원소를 검사하여 정렬하는 방법입니다.시간 복잡도가 O(n^2) 로 느리지만, 코드가 단순하여 사용하기 편리합니다. 버블정렬의 알고리즘 1. 앞에서 두 개의 원소를 비교합니다.2. 앞의 원소가 뒤의 원소보다 큰 경우 변경합니다. 작은 경우에는 변경하지 않습니다.3. 다음 위치의 두 개의 원소를 비교합니다.4. 위치의 끝까지 간 경우 다시 처음부터 비교합니다. 버블정렬의 예제 앞의 55 와 07 을 비교합니다. 07 이 55 보다 작으므로 위치를 변경합니다.55 07 78 12 42 07 55 78 12 4255 와 78 을 비교합니다. 55 가 작으므로 위치를 변경하지 않습니다.78 과 12 를 비교합니다. 12 가 작으므로 위치를 변경합니다.07 55 78 12 42 07 55 78 ..
퀵 정렬 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘입니다.n 개의 데이터를 정렬할 때 최악의 경우 O(n^2) 번의 비교를 수행하고 평균적으로 O(n log n)번의 비교를 수행합니다.정렬되지 않은 데이터들에 대해서 속도와 효율성이 가장 좋다고 할 수 있는 정렬 방식입니다. 퀵 정렬의 알고리즘 1. 리스트 가운데에서 하나의 원소를 선택합니다. 이 원소를 피벗 이라고 칭합니다.2. 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눕니다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 합니다. 분할은 마친 뒤에 피벗은 더이상 움직이지 않습니다.3. 분할된 두 개의 작은 리스트에 대해 재귀적으로 이 과정을 반복합니다...
C 는 소스로직 중 특정구간의 수행시간 차이를 계산하기 위해 마이크로 단위의 시간 함수 gettimeofday 를 지원합니다. gettimeofday 함수 구조#include int gettimeofday(struct timeval *tv, struct timezone *tz);timezone 은 잘 사용되지 않으며, timeval 의 구조는 다음과 같습니다.반환되는 값은 1970-01-01 00:00 부터 함수가 호출된 시간까지의 ms 값 입니다.struct timeval { time_t tv_sec; suseconds_t tv_usec; }tv_sec 는 초, suseconds_t 는 마이크로초를 저장합니다. gettimeofday 사용법$ cat mozi.c #include #include int ..
malloc 힙 영역에 메모리를 동적으로 할당합니다. malloc 함수 구조#include void* malloc(size_t size) free 힙 영역에 할당된 메모리를 해제합니다. free 함수 구조void* free(void*) malloc, free 사용법#include #include struct Mozi { char name[10]; int age; }; int main() { struct Mozi *mozi = malloc(sizeof(struct Mozi)); free(mozi); return 0; } malloc 을 사용한 후 free 를 해제하는 이유malloc 를 사용하여 메모리를 할당한 뒤, 해제하지 않으면 어플리케이션이 종료되기 전까지 메모리에 공간이 할당되어 있으며,낭비 혹은 ..