전처리기와 분할 컴파일 전처리pre-processing 컴파일러가 소스 파일을 컴파일하기 이전 과정으로 전처리기 지시자(#)를 사용함. 프로그램이 전처리 되는 과정은 소스파일(*.c)과 헤더 파일(*.h)을 사용하여 전처리한 소스 파일을 컴파일하여 오브젝트 파일(*.obj)로 만들고, 링커를 통해 라이브러리와 합쳐 실행 파일(*.exe)로 만듦. 전처리 지시자 프로그램의 선두에 위치하며, #으로 시작하고 문장 끝에 세미콜론을 사용하지 않음 전처리 지시자 기능 #include 프로그램 외부의 파일을 불러옴 #define 매크로 상수/함수를 정의 #undef 정의한 매크로 취소 #if ~ (#elif ~ #else ~) #endif 조건부 컴파일 #include 지정된 특정 파일의 내용을 해당 지시자가 있는..
파일 입출력 파일의 구분 파일은 저장방식에 따라 텍스트 파일과 이진 파일로 구분됨. 텍스트 파일은 모든 데이터가 문자열로 변환되어 기록되어 특별한 응용 프로그램 없이 내용을 볼 수 있음. 이진 파일은 데이터를 그대로 저장하기 때문에 저장 공간을 적게 차지하고 읽고 쓰기가 빠름 파일 입출력 기본 C 언어 기본 FILE구조체 포인터를 선언하여 파일에 접근할 수 있다. FILE *f; f = fopen("input.dat", "r"); fclose(f); FILE은 파일 입출력에 필요한 정보를 담은 구조체로, 각 파일마다 하나의 FILE 구조체 포인터를 연결하여 사용한다. 표준 스트림 표준 입출력 장치도 논리적으로는 파일로 간주한다. 표준 스트림에 대한 FILE 포인터 명은 아래와 같다. 스트림 이름 스트림명..
연산자 함수 자료형 심화 비트연산자 비트 단위로 처리되는 연산 비트 단위 논리 연산 unsigned int x, y, z; x = 0X2A; // x = 0000 0000 … 0010 1010 y = 0XAD; // y = 0000 0000 … 1010 1101 z = x & y; // z = 0000 0000 … 0010 1000 printf("%#X", z); // #: 16진수임을 나타내는 '0X'를 앞에 출력 결과: 0X28 비트 단위 이동 연산 x
동적 할당Dynamic Memory Allocation 동적 할당이란? 이름 그대로 프로그램이 실행되는 중간에 동적으로 메모리 공간을 할당해 주는 것. 할당 - 사용 - 해제의 3단계로 구성되며, 이 모든 과정을 프로그래머가 명시해줘야 한다. 기본 예제 동적할당을 위한 기본 함수들은 헤더에 구현되어 있다. malloc함수를 활용하면 원하는 만큼의 메모리를 할당받고, 그 시작 주소를 얻을 수 있다. (리턴타입은 void *이다.) 할당에 실패하면 NULL이 반환된다. #include int main() { int *p = NULL; //동적으로 할당된 메모리에 접근하기위한 포인터 p = (int *) malloc(5*sizeof(int)); //int 변수 5개의 크기만큼 메모리 할당 p[0] = 1; *..
구조체 Structure 여러가지 변수들을 묶어 객체처럼 관리하는 것. struct Student{ int id; char name[10]; }; 위처럼 정의한 후 선언할 때는 구조체명만 쓰는게 아니라 struct도 써줘야 한다. 초기화는 중괄호로 하면 된다. struct Student gio = {19011484, "GIO"}; 맴버 변수 사용은 .을 붙여서 하면 된다. gio.id = 19011484; 활용 1.정의와 선언을 한큐에 구조체 정의와 선언을 한번에 할 수 있다. struct Student{ int id; char name[10]; } st = {19011484, "GIO"}; C언어를 고인물 파티로 만드는 원인이 여깄었다. 2.역겹도르 이름이 없는 구조체를 만들 수 있다. struct {..
문자열 C에서 문자열(String)은 Char 배열로 처리. 문자열 끝에는 null 문자가 항상 있어야 하고, 이게 없으면 문자열이 아니라 문자 배열로 인식. 문자열의 표현은 큰따옴표 두개로 하고 문자열 입출력을 위한 서식 문자는 %s임. scanf("%s", str); %s는 문자열의 끝을 알리는 null 이 입력되기 전까지 입력을 받는데, 이는 공백, 개행문자, \t이 입력되기 전까지만 입/출력을 한다. null 문자 문자열의 끝에는 항상 문자열의 끝을 알리는 null 문자가 들어가며, 이는 \0로 표현한다. 또한 null의 아스키 코드는 0 이다. null 은 값이 널값임을 의미하고 NULL은 포인터가 널값임을 의미하나 사실 같은 것이다. char str[] = "Hello"; 위 코드의 결과로 생..
2.포인터 개요 및 복습 포인터는 메모리에 변수가 저장된 주소를 가르키는 변수 포인터를 왜 쓰나 변수에 간접접근, 동적할당 등 고급 기능에 사용 주의사항 시스템 메모리의 앞부분에는 운영체제가 올라가 있어서 접근이 불가하다.(Permission 필요) int* p = 8; 그러므로 위와 같은 코드로 메모리에 접근하면 오류가 난다. 포인터 배열 int arr = [1,2,3]; printf("%d", *arr); 배열을 대괄호없이 포인터로써 위와 같이 사용할 수 있다. 또한, 이 값에 정수 n을 더하면 변수의 n+1 번째 값의 주솟값이 된다. 포인터 배열 활용 printf("%d", *p); p++; 뭔가 코드가 안 이쁘다. printf("%d", *p++); 이런식으로 하면 코드가 섹시해진다. 그런데 가끔..
이 게시판의 글들은 깃허브 레포지토리 SejongUniv_C에서도 볼 수 있습니다. 고급 C 프로그래밍 기간 2019년 2학기 교수님 임필옥 SejongUniv_C C codes based on Sejong University C Programming course. 세종대 2019학년 1학년 C프로그래밍, 고급C프로그래밍 과목에서 짠 코드들과 참고 자료, 스터디 요약 등 1학기 1학기에는 C언어의 기초를 배웠다. 자료 정리가 잘 되어있지 않다. 2학기 2학기 고급C프로그래밍 수업에서는 포인터, 이중 포인터, 구조체, 문자열 처리와 같은 C언어의 심화에 대해 다뤘다. 각 챕터별로 파일을 잘 분류해놔서 보기 편하고, 실습 문제 파일이 함께 올라가 있어 보기 편할 것이다. README.md 파일에는 markd..