1. 자료형
- 기본형
- 정수형
- 문자형
- 실수형
- 열거형 (가능한 값들에 대한 나열형)
- void형 (타입이 정해지지 않은 자료형)
- 유도형
- 배열 (같은 타입의 자료 집합)
- 구조체 (다른 타입의 자료 집합)
- 공용체 (메모리를 공유하는 자료 집합)
- 포인터 (대상체의 번지를 가리키는 타입)
- 함수형 (함수의 번지를 가리키는 타입)
2. 변수의 선언
- 타입 변수명[=초기값][, 변수명, 변수명, ...];
- 예시
int Num;
int Num=12;
int a, b;
int a, b=3, c, d;
3. printf
int value=12;
char ch='S';
printf("Value is %d, character is %c.\n", value, ch);
int Num=123;
printf("%d\n", Num);
printf("%5d\n", Num);
printf("%05d\n", Num);
printf("%-5d\n", Num);
double pie=3.14;
printf("%f\n", pie);
printf("%10f\n", pie);
printf("%.2f\n", pie);
printf("%10,2f\n", pie);
printf("%010.2f\n", pie);
printf("%-10.2f\n", pie);
4. scanf
- scaf("서식문자열", &변수 [,& 변수, ...]);
int a, b;
double c;
int d, e;
scanf("%d", &a);
scanf("%d", &b);
scanf("%f", &c);
scanf("%d%d", &d, &e);
5. 정수형
int i
정수형 타입
| 타입 | 크기(바이트) | 범위 |
|---|
| int | 4 | -2,147,483,648~2,147,483,647 (−231∼231−1) |
| short | 2 | -32,768~32,767 (−215∼215−1) |
| long | 4 | -2,147,483,648~2,147,483,647 (−231∼231−1) |
| unsigned int | 4 | 0~4,294,967,295 (0∼232−1) |
| unsigned short | 2 | 0~65,535 (0∼216−1) |
- 참고
- int와 long은 크기와 수를 표현할 수 있는 범위가 동일하게 보인다.
- long은 어떤 플랫폼에서나 4바이트다.
- int는 CPU가 가장 효율적으로 다룰 수 있는 정수형으로 정의되어 있다. 그래서 int형의 실제 크기는 플랫폼에 따라 달라진다.
int형의 정의를 확인해보면 'CPU의 레지스터와 동일한 크기를 가지는 타입'이다.
더 나아가서 포인터 값의 크기도 플랫폼에 따라 다르다.
- 정수형 상수
- 상수 값에 접미사를 붙여 값이 저장될 크기를 지정할수 있다.
- short 타입으로 저장될 수 있는 값이지만 접미사 'L'을 붙여 long형 상수로 사용할 수 있다.
- 접미사 'U'를 붙여 unsigned 상수로 사용할 수 있다.
- 접미사 'UL'를 붙여 unsigned long형 상수로 사용할수 있다.
- 값의 진법 표현
- 8진수 : '접두사' 0을 붙인다. (ex. 017, 032)
- 16진수 : '접두사' 0x를 붙인다. (ex. 0x12ab, 0x3f) (알파벳은 대소문자 구분하지 않음)
- printf에서 %X 서식을 이용하면 16진수로 출력이된다.
6. 실수형
| 타입 | 크기(바이트) | 범위 | 유효자리수(십진) |
|---|
| float | 4 | 3.4×10−38∼3.4×1038 | 7 |
| double | 8 | 1.7×10−308∼1.7×10308 | 15 |
| long double | 10~16 | 1.2×10−4932∼1.2×104932 | 19 |
- 실수형 상수
- 단순히 소수점 값을 변수에 입력할 수도 있고, 1.23456e2 로 입력하여 대입할 수도 있다.
- 접미사 F를 붙이면 float 상수다. 아무 접미사도 붙이지 않는다면 double 상수다.
- (소수점 값에) 접마사 L을 붙이면 long double 상수다.
- printf 실수형 서식
- %f는 고정 소수점 표현 서식이다. (ex. 123.456000)
- %e는 부동 소수점 표현 서식이다. (ex. 1.23456e+002)
- %g는 일반 표현 서식이다. (ex. 123.456)
- %g는 %f와 %e 중 더 짧고 간단한 방법을 자동을 선택함.
7. 문자형
문자
- 문자 하나를 표현하는 자료형
- 문자 인코딩 방식으로 아스키(ASCII) 코드 방식을 많이 사용한다.
- 아스키 코드는 0~255 사이의 숫자에 문자를 대응 시켜 놓은 것.
- 실제 아스키 코드는 0~127까지의 숫자에만 문자가 대응되어 있다.
- char형 변수에 문자를 대입할 때는 따옴표로 한 문자만 묶어서 사용한다.
- printf 함수를 이용하여 char 변수를 표현할 때는 '%c'서식을 이용한다.
- '%d'를 이용하면 해당 문자에 대응되는 숫자가 출력된다.
- Escape Sequence (확장열) 참고.
| 타입 | 크기(바이트) | 범위 |
|---|
| char | 1 | -128~127 (−27∼27−1) |
| unsigned char | 1 | 0~255 (0∼28−1) |
문자열
- 문자열은 일련의 문자가 연속되어 있는 것이다. 즉 문자의 집합이 곧 문자열이다.
- 문자열 상수는 문자 상수와 달리 겹따옴표로 감싸서 표현한다.
- 예를 들어 'S'는 S라는 문자 하나만을 표현하지만, "S"는 한 글자로만 된 문자열이다.
char str[6]="Korea";
- 위 코드는 다음과 같이 공간이 할당되고 초기화가 된다.
- 아래 그림처럼 각 격자는 1바이트의 문자들이며 각 격자에 문자 하나씩이 들어있다.
- 제일 끝에 있는 \0은 여기가 문자열의 끝임을 알리는 역할을 하며 널 종료 문자라고 한다.
메모리는 연속적인 공간이기 때문에 그 끝을 명확히 표시해야 한다.
- 따라서 널 종료 문자까지 고려해서 배열의 크기를 지정해야 한다.
- printf 함수를 이용하여 문자열을 출력하고자 할 때는 %s 서식을 이용해야한다.
8. 열거형
- 변수가 가질 수 있는 가능한 값들을 나열해 놓은 타입.
- enum {멤버, 멤버, ...} 변수;
enum {EAST, WEST, SOUTH, NORTH} mark;
enum {EAST=5, WEST=10, SOUTH, NORTH} mark;
enum {man=1, woman=2, girl=2} human;
mark=EAST;
if (mark == WEST){
}
- 태그
- 열거형은 내부적으로 정수형으로 처리되지만 값의 범위가 엄격하게 정해지는 별도의 타입이다.
그래서 열거형 타입을 먼저 정의하고 이 타입으로부터 변수를 선언하는 방법이 더 많이 사용된다.
이때 열거형 타입에 대해 붙여지는 이름을 태그(tag)라고 하며 int, double과 마찬가지로 타입의 자격을 가진다.
- enum 태그명 {멤버, 멤버, ...}
enum origin {EAST, WEST, SOUTH, NORTH};
enum origin mark;
mark=WEST;
enum origin mark2, mark3;
void func(enum origin mark);
9. 유도형
- 유도형은 기본형의 조합에 의해 만들어지는 타입들이며, 기본형 변수 여러 개를 모아서 또는 기본형을 약간 변형하여 만들어지는 타입들이다.
9.1. 배열
int array[5];
double rate[10];
int Score[3][10]
printf("%d", array[3]);
- 컴파일러는 배열 선언문을 만나면 요소의 크기만한 메모리를 개수만큼 연속적으로 할당한다.
9.2. 구조체
- 동일한 타입의 집합인 배열과는 달리 구조체(Structure)는 서로 다른 타입의 집합이다.
- 구조체에 속하는 개별 변수들을 멤버라고 한다.
- 정수형 변수와 실수형, 문자형 등의 기본형 변수뿐만 아니라 배열이나 구조체 같은 큰 변수도 멤버가 될 수 있다.
- struct { 멤버 목록 } 변수명;
struct {
char Name[10];
int Age;
double Height;
} Friend;
Friend.Age=28;
printf("%s", Friend.Name);
- 공용체(Union)은 구조체와 유사하지만 멤버끼리 기억 공간을 공유한다는 점이 다르다.
9.3 포인터
- 포인터 선언
- 변수에 저장된 값의 메모리 번지를 읽는 연산자는 '&'다.
- 포인터가 가리키는 번지의 값을 읽는 연산자는 '*'이다.
int Num=629;
int *pi;
pi=&Num
prinf("%d", *pi);
9.4 사용자 정의형
typedef int jungsoo;
typedef enum {True, False} Bool;
typedef int *pint;
typedef int arint[10];
typedef struct {int a; doubleb;} myst;
9.5 논리형 (실제로는 반영되지 않음)
- C 문법은 논리형을 별도의 기본형 타입으로 인정하지 않는데, 그래서 C 컴파일러들은 열거형이나 사용자 정의형으로 논리형 타입인 BOOL을 만들어서 사용한다. 아래 예시 참고.
typedef int BOOL;
#define TRUE 1
#define FALSE 0;
- 참고
- 논리형은 stdbool.h를 이용하여 사용할 수 있다.
#include <stdbool.h>
bool l_switch;
l_switch=true;
printf("%d\n",l_switch);
l_switch=false;
printf("%d\n",l_switch);
출처 : 혼자 연구하는 C/C++ 1 / 김상형 저 / 와우북스