반응형 공부 자료실/C언어27 C언어 - 동적 메모리 할당 보통 배열의 크기를 컴파일 전에 선언해 두고 사용합니다. 가장 많이 사용하는 방법으로 보통 '정적 메모리 할당'이라고 합니다. 이 경우에는 미리 선언해 두고 해제할 필요가 없다는 장점이 있지만 반대로 미리 선언했기 때문에 비효율적일 수도 있습니다. 예를 들어 100의 크기의 배열을 선언했지만 막상 필요한 크기는 20이 되면 80은 낭비가 됩니다. 그래서 '동적 메모리 할당'을 이용해서 적절하게 메모리를 관리해야 할 경우가 발생합니다. 먼저 동적 메모리 할당을 하기 위해서는 새롭게 라이브러리를 추가해야 합니다. #include 이제 동적 메모리 할당에 필요한 함수에 대해 알아보겠습니다. malloc() void *malloc(size_t _Size); 인자로 전달받은 크기만큼의 메모리를 할당합니다. voi.. 공부 자료실/C언어 2020. 8. 7. C언어 - 파일 입출력 C언어의 코드를 작성 후 실행해서 나온 결과는 결국 실행을 종료하면 사라지게 됩니다. 그래서 결과를 저장하는 방법 중 하나인 파일 입출력에 대해서 알아보겠습니다. fopen() 먼저 파일을 열거나 새로 만들기 위해서 사용하는 함수의 원형은 다음과 같습니다. FILE *fopen(const char *name, const char *mode) fopen은 파일의 정보를 FILE 포인터로 반환합니다. (FILE은 stdio.h에 선언되어있는 구조체 자료형입니다.) 파일을 열 때 실패하면 NULL을 반환합니다. const char *name는 파일의 경로입니다. 파일 이름만 적게 되면 현재 프로젝트가 저장된 경로가 기본으로 지정됩니다. 특정 파일을 찾아서 열고 싶다면 파일 경로를 직접 입력하면 됩니다. ex).. 공부 자료실/C언어 2020. 8. 5. C언어 - #if, #elif, #else, #endif 와 ifdef, #ifndef, #endif 지시문 #if, #elif, #else, #endif와 #ifdef, #endif를 보통 조건부 컴파일 지시자라고 합니다. #이 앞에 오는 전처리 지시자입니다. C언어뿐만 아니라 C++, C#에서도 자주 등장하므로 알아보고 가겠습니다. 먼저 #if, #elif, #else, #endif부터 알아보겠습니다. 일반적으로 사용하는 if , else if, else와 방식은 유사합니다. 대신 #elif, #else는 사용하지 않아도 상관없지만 #if를 사용하면 꼭 끝나는 부분에#endif를 삽입해야 합니다. 전처리기는 {}를 사용하지 않기 때문에 끝을 내줘야 합니다. 보통 조건부로 코드를 추가 및 제거해서 컴파일할 때 많이 사용합니다. 예제로 알아보겠습니다. #include #define VERSION 3 int ma.. 공부 자료실/C언어 2020. 7. 22. C언어 - 내장 매크로 *Visual Studio 2017로 작성했습니다. 내장 매크로는 사용자가 사용하기 편하게 미리 정의되어 있는 매크로입니다. 전처리기 매크로이기 때문에 컴파일하기 전에 해당 매크로는 해당 결과로 치환이 됩니다. 몇 가지 자주 사용하는 매크로만 알아보겠습니다. __는 _(underbar 또는 underscore)가 2개입니다. 예제로 매크로를 사용해 보겠습니다. #include void fun(); int main(void) { printf("컴파일 날짜 : %s \n", __DATE__); printf("컴파일 시간 : %s \n", __TIME__); printf("컴파일 날짜 요일 시간 : %s \n", __TIMESTAMP__); printf("라인 번호 : %d \n", __LINE__); fun.. 공부 자료실/C언어 2020. 7. 21. C언어 - #define #define은 전처리기 지시자로 컴파일하기 전에 실행되는 컴파일러의 한 부분입니다. #define은 기호 상수를 만들기 위한 지시자로 보통 '매크로'라고 합니다. 매크로를 정의하는 방법은 #define 이름 값 *;(세미콜론)을 사용하면 안 됩니다. 보통 매크로 이름은 대문자를 많이 사용합니다. 정의한 매크로를 사용하면 컴파일하기 전에 해당 매크로에 정의한 값으로 변경이 되는 방식입니다. 예제를 통해 매크로를 사용해보겠습니다. #include #define ARRAY_SIZE 10 int main(void) { int num[ARRAY_SIZE]; for (int i = 0; i < ARRAY_SIZE; i++) num[i] = i; return 0; } 배열에 매크로를 적용해보면 배열의 크기를 매크로.. 공부 자료실/C언어 2020. 7. 4. C언어 - void 포인터 지금까지의 모든 포인터는 선언할 때 자료형이 어떤 건지 명시했었습니다. 이번에는 정해놓고 선언하는 포인터가 아닌 그냥 메모리 주소만 선언하는 포인터에 대해 알아보겠습니다. 포인트의 자료형에 void가 들어가게 되면 포인터는 단순히 메모리 주소만 선언된 변수가 됩니다. void *변수이름; void 포인터는 어떤 자료형이든 변할 수 있습니다. #include int main(void) { int num = 50; char cha[] = "Hello world"; int *pnum = # void *p_val= # void *p_val2; p_val2 = # //printf("%d \n", *p_val); //애러발생 //printf("%d \n", *p_val2); //printf(".. 공부 자료실/C언어 2020. 7. 3. C언어 - 포인터와 다중 포인터 앞에서 간간히 포인터를 사용했습니다. 오늘은 포인터와 다중 포인터에 대해 알아보겠습니다. 포인터는 메모리의 주소를 저장하는 변수입니다. 메모리에 있는 데이터는 결국 메모리 주소에 저장이 되기 때문에 직접적인 접근이 가능해집니다. 포인터의 선언은 다음과 같습니다. 자료형 *변수이름; 예제로 살펴보겠습니다. #include int main(void) { int num = 50; //&는 주소 연산자로 변수의 이름을 받으면 해당 변수의 주소를 반환합니다. printf("num의 값 = %d \n", num); printf("num의 주소는 = %p \n", &num); int *p_num = # printf("*p_num의 값 = %d \n",*p_num); printf("*p_num에 저장된 주소는 .. 공부 자료실/C언어 2020. 7. 3. C언어 - typedef typedef는 기존의 자료형에 새롭게 새롭게 별칭을 부여할 때 사용합니다. typedef의 형식을 알아보겠습니다. typedef 기존type 별칭; typedef를 이용하면 구조체, 공용체, 열거형도 조금더 간단하게 사용할 수 있습니다. 예제를 통해 보겠습니다. #include typedef struct student{ char name[20]; int age; char address[30]; }STUDENT; //새로운 STUDENT 키워드를 부여 int main(void) { STUDENT stu; stu.age = 20; printf("나이는 = %ㅇ \n", stu.age); return 0; } struct앞에 typedef을 선언하고 정의뒤에 새로운 별칭을 추가로 선언해주면 구조체 변수를 선.. 공부 자료실/C언어 2020. 7. 2. C언어 - 열거형 열거형(enumeration)은 정수형 상수를 사용하기 편하게 이름을 부여해서 나열해 놓은 자료형입니다. 보통 변수를 상수로 만들기 위해서는 const를 자료형 앞에 붙여줍니다, const int num = 0; 하지만 선언할 양이 점점 많아지면 관리하기가 힘들어집니다. 이때 열거형을 사용합니다 열거형은 enum 키워드를 사용합니다. 열거형을 정의하는 방법은 다음과 같습니다. enum 열거형이름 { 상수1, 상수2, 상수3, . . . }; 구조체나 공용체랑 다르게 자료형 없이 정의해야 합니다. 열거형도 사용하기 위해서는 구조체나 공용체 처럼 변수로 선언해야 합니다. enum 열거형이름 변수이름; 정의하고 바로 변수 선언도 가능합니다. enum 열거형이름 { 상수1, 상수2, 상수3, . . . } 변수.. 공부 자료실/C언어 2020. 7. 2. C언어 - 공용체 공용체는 얼핏 보면 구조체와 비슷하지만 메모리를 사용하는 게 다릅니다. 구조체는 멤버들이 각각 메모리를 할당해주지만, 공용체는 멤버 변수 중 메모리 크기가 가장 큰 만큼만 할당됩니다. 할당된 메모리를 모든 멤버 변수가 공유를 하기때문에 모든 멤버 변수들의 값을 저장할 수 없는 경우도 있습니다. 정의 및 선언방법, 사용방법은 구조체와 비슷합니다. 대신 공용체는 struct가 아니라 union을 사용합니다. union 공용체이름 { //멤버 자료형 이름; 자료형 이름; 자료형 이름; 자료형 이름; . . . }; union 구조체이름 변수이름; 그러면 구조체와 공용체의 차이점을 예제를 통해 보겠습니다. #include union uni_1 { char st[30]; int num; float num2; };.. 공부 자료실/C언어 2020. 7. 1. C언어 - 문자열 변환 문자열은 어떤 값인가에 따라서 정수형이나 실수형으로 변환이 가능합니다. 먼저 sscanf()_s에 대해 알아보겠습니다. sscanf()_s는 문자열에서 원하는 자료형의 데이터를 읽어내서 반환합니다. *sscanf()도 사용은 가능하나 warning이 발생합니다. 해당 st 문자열에서 정수형 형식을 읽어서 정수형 값을 num변수에 저장하는 코드입니다. sscanf(st, "%d", &num); sscanf()_s함수의 원형은 다음과 같습니다. int sscanf_s(const char* str, const char* format, ...); 보기만 해서는 잘 이해가 안 갈 수 있습니다. format을 어떤 식으로 처리하냐에 따라서 굉장 다양하게 사용이 가능합니다. 예제와 함께 보겠습니다. #include .. 공부 자료실/C언어 2020. 6. 30. C언어 - 문자,문자열의 입력, 출력 scanf()와 printf()로 문자, 문자열의 입출력을 실행합니다. char ch; scanf("%c", &ch); printf("%c \n", ch); char st[30]; scanf("%s", &st); printf("%s \n", st); 하지만 scanf()와 printf()는 문자, 문자열 외에도 처리하는 자료형이 많기 때문에 무거운 편입니다. 그래서 문자와 문자열에 사용하는 입출력 함수에 대해 알아보겠습니다. 문자 입력 함수에 대해 알아보겠습니다 getchar()는 하나의 문자를 읽어서 반환하는 함수입니다. char ch; ch = getchar(); 입력할 때는 여러 개의 문자를 입력할 수 있지만 반환은 첫 번째로 입력된 한 개의 문자만 반환합니다. conio.h의 _getch()또는 .. 공부 자료실/C언어 2020. 6. 30. 이전 1 2 3 다음 반응형