프로그래밍/C

30

함수 부분 제어 반환에 대해

C, C++에서는 함수의 모든 경로에서 반환하지 않아도 됩니다. #include int function(int n) { if (n == 1) { return 1; } } int main(void) { printf("%d \n", function(1)); printf("%d \n", function(2)); }이런 상황을 말합니다. function 함수는 항상 의도한 값이 반환되지 않습니다. warning C4715: 'function': 모든 제어 경로에서 값을 반환하지는 않습니다.컴파일하면 이런 경고가 나타납니다. C#의 경우 C와는 완전히 다른 언어지만, 모든 코드 경로에서 return 문이 있어야 합니다. 는 저도 반드시 적용되어야 한다고 생각하기에 꺼내봤습니다. using Syste..

프로그래밍/C 2020.07.08 Plorence

C언어의 기본적인 강좌?를 마치며..

중간에 글을 정리하는 방법도 여러 번 바꿨는데, 그냥 지금이 제일 무난한 듯 싶습니다. 하다가 안하다가 해서 긴 시간이 걸렸지만 C++에서는 꾸준히 올리도록 하겠습니다. register 키워드 같은 건 안썼지만 레퍼런스 참고하셔도 충분합니다. C99부터 많이 생겨났지만 어차피 전 C++을 쓰기에 안올릴겁니다. https://en.cppreference.com/w/c/keyword C keywords - cppreference.com This is a list of reserved keywords in C. Since they are used by the language, these keywords are not available for re-definition. The most common keyword..

프로그래밍/C 2019.05.29 Plorence

C 공용체(Union)

공용체(Union Type) 구조체는 struct라는 키워드를 사용해서 정의하는 반면, 공용체는 union이라는 키워드를 사용해서 정의합니다. 유니온이라고 읽습니다. 공용체는 일반적으로 잘 쓰이지 않습니다. 정의와 선언 union uPoint { int xpos; int ypos; }; 정의에서 구조체와 차이점이라면 키워드 struct 대신에 union을 사용합니다. 그 외에는 동일합니다. 변수 선언할때는 struct대신에 union 키워드를 쓰면 됩니다. 구조체와 차이점 각각의 변수가 메모리 공간에 할당되는 방식과 접근의 결과에는 많은 차이가 있습니다. struct sPoint { int xpos; int ypos; }; union uPoint { int xpos; int ypos; }; 위의 구조체와..

프로그래밍/C 2019.05.29 Plorence

조건부 컴파일(Conditional Compilation)을 위한 매크로

조건부 컴파일 매크로 조건부 컴파일 매크로는 특정 조건에 따라 소스코드의 일부를 삽입하거나 삭제할 수 있도록 디자인된 지시자입니다 총 다섯 가지가 있습니다. #if... #endif : 참이라면 #ifdef... #endif : 정의되었다면 #ifndef... #endif : 정의되지 않았다면 #else의 삽입 (#if,#ifdef,#ifndef에 해당) : #if(또는#ifdef,#ifndef)에서 아니라면 #elif의 삽입 (#if에만 해당) : else if와 같은것.(앞 조건문이 참이 아니라면) 4,5번은 1,2,3번의 중간에 들어간다는 공통점이 있고 1,2,3번은 끝이 #endif라는 점입니다. #if... #endif #include #define one 1 #define zero 0 int ..

프로그래밍/C 2019.05.29 Plorence

C 선행처리기와 매크로

선행처리기 선행처리란 컴파일 이전의 처리를 의미합니다. 선행처리기는 삽입해 놓은 선행처리 명령문대로 소스코드의 일부를 수정할 뿐인데, 여기서 말하는 수정이란 단순 치환의 형태가 대부분입니다. 전처리기라고 부르기도 합니다. #define, enum이 이에 해당합니다. 컴파일의 순서는 소스파일 >선행처리기 > 선행처리 거친 소스파일 > 컴파일러 > 오브젝트 파일 > 링커 > 실행파일(exe) 순입니다. 자주 사용해왔던 #include 선언도 #문자로 시작하는 선행처리 명령문입니다. 의미는 "stdio.h 파일의 내용을 이곳에 가져다 놓으세요" 선행처리 명령문,#define 형식이 두 가지가 있습니다. #define Object-like macro 형식 #define one 1 위 코드의 의미는 "one을 1..

프로그래밍/C 2019.05.26 Plorence

C 메모리 구조와 동적 할당

C언어 메모리 구조 메모리 구조는 4개의 영역으로 나뉘어 있습니다. 메모리 공간을 나눠서 유사한 성향의 데이터를 묶어서 저장을하면 관리가 용이해지고 메모리의 접근 속도가 향상됩니다. 각 영역 코드 영역(Code Area) 코드 영역은 이름 그대로 실행할 프로그램의 코드가 저장되는 메모리 공간입니다. 따라서 CPU는 코드영역에 저장된 명령문들을 하나씩 가져가서 실행을 합니다. 데이터 영역(Data Area) 데이터 영역에는 전역변수와 static으로 선언되는 static변수가 할당됩니다. 즉, 이 영역에 할당되는 변수들은 프로그램의 시작과 동시에 메모리 공간에 할당되어 프로그램 종료 시까지 남아있게 된다는 특징이 있습니다. 스택 영역(Stack Area) 스택 영역에는 지역변수와 매개변수가 할당됩니다. 이..

프로그래밍/C 2019.05.25 Plorence

C 열거형(Enumerated Type)

열거형(Enumerated Type) 열거형은 숫자보다 문자가 더 친근한 우리들을 위해 존재합니다. 마치 인터넷 URL 입력해서 접속할 때 아이피 대신 도메인을 입력해서 들어가듯 C언어에서도 같은 이유로 존재합니다. 정의와 선언 열거형으로 Result이라는 이름의 자료형을 정의한다는 것은 다음의 의미를 지닙니다. Result형 변수에 저장이 가능한 정수 값들을 결정하겠다 enum Result { Success=1, Fail=2, }; 이렇게 됩니다. Success = 1는 Success를 정수 1을 의미하는 상수로 정의합니다. 그리고 이 값은 Result형 변수에 저장이 가능합니다. 정의할 때 결정되는 값 정의할 때 결정되는 값은 아무것도 쓰지 않으면 0부터 시작됩니다. 또한 첫번째 값에 따라 나머지 값..

프로그래밍/C 2019.05.24 Plorence

typedef과 구조체

typedef typedef 선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것입니다. 예를 들면 typedef int INT 라고 선언을 하게 되면, 자료형의 이름 int에 INT라는 이름을 추가로 붙여줍니다. 결국엔 int num1; INT num2; 동일한 자료형을 선언하게 됩니다. typedef 선언에 있어서 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이뤄집니다. 즉 typedef name1 name2 name3라고 선언하면 name3가 'name1 name2'에 부여된 새로운 이름이 된 것입니다. 이때 name1, name2는 어떠한 의미가 있어야 합니다.(안 그러면 컴파일 에러가 발생함.) 당연한 거지만, typedef의 유효 범위 내에서만 사용이 가능합니다. #i..

프로그래밍/C 2019.05.23 Plorence

C 구조체

구조체(structure) 구조체는 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구입니다. 구조체를 기반으로 우리는 새로운 자료형을 정의할 수 있습니다. 만약 프로그램상에서 마우스의 좌표 정보를 저장하고 관리해야 한다고 가정하면 다음과 같이 두 개의 변수를 선언해야 합니다. int xpos; //마우스 x 좌표 int ypos; //마우스 y 좌표 그런데 이 둘은 항상 함께하기 마련입니다. 이 둘은 서로 독립된 정보를 표현하는것이 아니라, 마우스의 위치라는 하나의 정보를 표현하기 때문입니다. struct point { int xpos; int ypos; } point 라는 이름의 구조체를 정의한 결과 이때 point 라는 이름이 int나 double과 같은 자료형의 이..

프로그래밍/C 2019.05.21 Plorence

C 표준입출력과 버퍼와 스트림

이때까지 썼던 printf함수, scanf함수 모두 표준 입출력 함수입니다. 버퍼 이런 표준 입출력 함수를 통해 데이터를 입출력 하는경우 해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다. 메모리 버퍼는 데이터를 임시로 모아두는(저장하는) 메모리 공간입니다. 키보드로 입력된 데이터가 입력스트림을 거쳐서 입력 버퍼로 들어가는 시점은 엔터 키가 눌리는 시점입니다. 엔터키를 누르기 전에는 fgets 함수가 문자열을 읽어 들이지 못하는 것입니다. 엔터키를 누르기 전까지는 입력버퍼가 비워져 있습니다. 스트림 먼저 입력이란 프로그램 안으로 데이터가 흘려 들어오는 것을 말합니다. 대표적인 입력 장치로 키보드, 파일이 있습니다. 출력이란 프로그램 밖으로 데이터가 흘러 나가는 것을 말합니다. ..

프로그래밍/C 2019.05.20 Plorence

C언어 함수 포인터와 void 포인터

함수 포인터 함수의 이름은 포인터입니다. 마치 배열의 이름이 포인터인듯이 함수의 이름도 포인터입니다. 이걸 함수 포인터라고 하고 배열의 이름과 마찬가지로 상수 형태입니다. 함수 포인터의 특징 함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다(함수 포인터). 함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장할 수 있다. 함수 포인터 변수를 선언할려면 함수 포인터의 형(type)을 알아야한다. 함수 포인터의 형 함수 포인터의 형 정보에는 반환형과 매개변수 선언에 대한 정보를 담기로 약속합니다. 즉, 함수의 반환형과 매개변수 선언이 동일한 두 함수의 함수 포인터 형은 일치합니다. 함수 포인터의 형을 함수 시그니처(function signature)라고도 부르는데,이건 C++ 함수..

프로그래밍/C 2019.04.18 Plorence

포인터의 포인터(이중 포인터)에 대한 이해

보통 그냥 포인터라고 하면 포인터를 선언할 당시에 *연산자가 하나만 쓰입니다. 선언할 때 *연산자를 더 늘려서 이중, 삼중까지 가능합니다. 영어로는 더블 포인터,트리플 포인터라고 부릅니다. 이중 포인터 이중 포인터는 그나마 쓰이지만 삼중 포인터는 잘 안 쓰입니다. 이중 포인터는 2차원 배열이나 포인터 그자체를 다뤄야 할 때 많이 쓰입니다. 이중 포인터 선언 Type ** Name; *연산자 1개 더 붙여주면 됩니다. 이중 포인터에 대한 이해 이중 포인터를 이해하려면 단일 포인터와 *연산자를 빠삭하게 이해하고 있어야 합니다. #include int main(void) { int num = 10; int * ptr = # int ** dptr = &ptr; } 하나씩 어떠한 값을 가지고 있는지 알아봅..

프로그래밍/C 2019.04.18 Plorence