공부중

[C] C 기초 본문

프로그래밍/C언어

[C] C 기초

복습 2024. 8. 16. 01:14
728x90

실습은 GCC 계열 컴파일러를 사용

 


 

1. 식별자와 키워드. 

식별자(identifier) : 프로그래머가 코드에서 사용하기 위해 붙이는 이름

키워드 : C언어에서 사용하려고 미리 지정한 단어들 (if, for , int 등)

 

2. 코드블럭

{}로 구분되므로 들여쓰기 및 띄어쓰기는 영향을 주지 않음. 하지만 가독성을 위해 들여쓰기를 권장. 

 

 

3. 주석

// 한 줄 주석

/* 
여러줄 주석
*/

 

 

 

 


자료형

 

1. 자료형 

 

메모리의 값을 사용하기 위해서는 자료형의 정의와 메모리 에 대한 이해가 필요하다. 

자료형은 값의 종류, 메모리 저장 공간 크기, 데이터의 표현 범위 결정한다. 

정수, 실수, 문자 등의 자료형 뿐만이 아니라 새로운 자료형을 만들어 내는 사용자 정의 자료형(user-defined data type)도 존재한다. 

 

 

 

2. 상수의 개념

상수(constant)는 프로그램이 실행되는 동안 그 값이 변경되지 않는 데이터를 의미합니다. 이는 변수와 대비되는 개념이며, 상수는 일반적으로 프로그램 코드 내에서 고정된 값을 나타내는데 사용됩니다. 예를 들어, 원주율 π(3.14159...)나 빛의 속도(299,792,458 m/s) 같은 물리적인 상수 또는 사용자가 코드 내에서 자주 사용할 값이 상수로 정의될 수 있습니다.

 

2.2 리터럴 상수

리터럴 상수(literal constant)는 프로그램의 소스 코드에 직접 적힌 고정된 값입니다. 이는 코드 내에서 직접적으로 값을 나타내며, 종류에 따라 다음과 같이 구분됩니다:

  • 정수 리터럴: 42, 0b101010, 0x2A
  • 실수 리터럴: 3.14159, 0.01
  • 문자 리터럴: 'A', 'b', '1'
  • 문자열 리터럴: "Hello, world!", "123abc"

 

 

3. 정수 상수 표현 방법

C 언어에서 정수 상수를 표현하는 방법은 다양하며, 주로 사용되는 네 가지 진법으로 구분됩니다:

  1. 10진수 (Decimal):
    • 가장 흔히 사용되는 숫자 체계로, 일반적인 수학에서 사용하는 숫자와 동일합니다.
    • 예: 10, 256, 1024
  2. 16진수 (Hexadecimal):
    • 메모리 주소 표현이나 색상 코드 등에 사용되며, 0x 또는 0X 접두사를 사용합니다.
    • 예: 0xFF, 0x1A3B, 0x10
  3. 8진수 (Octal):
    • 파일 시스템의 권한 설정 등에 사용되며, 숫자 앞에 0을 붙여 표현합니다.
    • 예: 0755, 012, 001
  4. 2진수 (Binary):
    • 컴퓨터의 비트 레벨 연산을 표현할 때 사용되며, 0b 또는 0B 접두사를 사용합니다.
    • 예: 0b1011, 0b11001001

 

 

 

4. 문자 및 문자열 상수 표현방법

4.1 문자 상수 표현방법

문자 상수는 C언어에서 한 개의 문자를 표현하는 방법으로, 작은따옴표(')를 사용하여 문자를 감싸 표현합니다. 이는 프로그램 내에서 문자의 리터럴 값을 나타내며, 문자 상수는 메모리에서 일반적으로 한 바이트를 차지합니다. ASCII 코드에 따라 각 문자는 특정한 정수 값과 매핑됩니다.

 

  • 'a' : 소문자 a
  • 'A' : 대문자 A
  • '\"' : 큰따옴표 자체를 나타내는 경우, 이스케이프 문자를 사용 (\")
  • ',' : 콤마
  • ' ' : 공백 문자

 

 

 

4.2 문자열 상수의 표현 방법

문자열 상수는 0개 이상의 문자를 포함하며, 큰따옴표(") 사이에 문자들을 위치시켜 표현합니다. 문자열 상수는 메모리에서 연속된 문자들의 배열로 저장되며, 문자열의 끝에는 자동으로 널 문자(\0)가 추가되어 문자열의 끝을 나타냅니다. 이 널 문자를 포함하여 총 사용되는 메모리의 크기가 결정됩니다.

 

  • "Hello, World!" : 일반적인 문자열
  • "12345" : 숫자도 문자열로 표현 가능
  • "" : 빈 문자열, 문자는 없지만 널 문자는 포함되어 있음

 

 

 

 

5. 자료형 구조도 

 

https://www.geeksforgeeks.org/data-types-in-c/

 

 

 

C 언어의 자료형 구조

  1. 기본 타입 (Primitive Types)
    • 정수형 (Integer Types)
      • int, short, long, long long (각각 signed와 unsigned 버전 포함)
    • 실수형 (Floating-Point Types)
      • float, double, long double
    • 문자형 (Character Types)
      • char (보통 signed char 또는 unsigned char로 취급)
    • 불리언형 (Boolean Type)
      • _Bool (C99부터 표준에 추가)
  2. 열거 타입 (Enumeration Type)
    • enum { ... }
  3. 복합 타입 (Composite Types)
    • 배열 (Arrays)
      • 예: int numbers[10];
    • 구조체 (Structures)
      • struct { ... }
    • 공용체 (Unions)
      • union { ... }
  4. 포인터 타입 (Pointer Types)
    • 예: int *ptr;, char *str;
  5. 함수 타입 (Function Types)
    • 예: int func(int, double);

 

 


6. void

사용하는 경우 설명 예제
함수의 인지로 사용 인자로 전달되는 값이 없음 int main(void){}
함수의 반환 자료형으로 사용 함수가 값을 반환하지 않음 void f() {}
포인터로 사용 어떤 자료형의 주소값도 저장 가능  

 

 

 

 

7. 스칼라 자료형. (Scalar Types)

 

스칼라 자료형이란 한 번에 하나의 값만을 가질 수 있는 자료형을 말합니다. 이는 C 언어의 기본 타입 중 하나로 분류되며, 가장 단순한 형태의 데이터를 저장하는 데 사용됩니다. 스칼라 자료형은 다음과 같은 범주에 포함됩니다:

  1. 정수형 (Integer Types)
    • int, short, long, long long 및 각각의 unsigned 버전 등
  2. 실수형 (Floating-Point Types)
    • float, double, long double
  3. 문자형 (Character Types)
    • char, signed char, unsigned char
  4. 불리언형 (Boolean Type)
    • _Bool (C99 표준부터)

스칼라 자료형은 연산, 함수 인자 전달, 반환값 등 다양한 프로그래밍 상황에서 중요한 역할을 합니다. 이 자료형들은 메모리의 단일 위치에 저장되며, 각 자료형은 특정 크기와 범위의 값을 표현할 수 있습니다.

 

 

 

 

8. 복합 자료형 (Aggregate Types)

복합 자료형은 여러 값을 하나의 자료형에 저장할 수 있게 해주는 자료형입니다. C 언어에서는 다음과 같은 복합 자료형을 사용합니다:

  1. 배열 (Arrays)
    • 동일한 타입의 여러 데이터를 순차적으로 저장합니다. 예: int numbers[10];
  2. 구조체 (Structures)
    • 서로 다른 타입의 데이터를 하나의 단위로 묶어 관리합니다. 예: struct {int age; char *name;};
  3. 공용체 (Unions)
    • 서로 다른 데이터 타입을 메모리의 같은 위치에 저장하여 한 번에 하나의 데이터만 사용합니다. 예: union {int id; float salary;};

이러한 복합 자료형은 데이터를 구조화하고 복잡한 데이터 구조를 관리할 수 있게 해줍니다. 예를 들어, 배열은 데이터 분석이나 수학 연산에서, 구조체는 데이터베이스 레코드나 객체 지향 프로그래밍에서, 공용체는 메모리 절약을 목적으로 다양한 형태의 데이터를 동일한 메모리 공간에서 사용할 때 유용합니다.

 

 

 

 


 

9. 자료형 크기 

 

C 언어에서 자료형의 메모리 크기는 플랫폼과 컴파일러에 따라 달라질 수 있습니다. 하지만 일반적인 32비트 또는 64비트 시스템에서의 대략적인 메모리 크기를 아래와 같이 표로 정리할 수 있습니다:

자료형메모리 크기 (32비트 시스템)메모리 크기 (64비트 시스템)

char 1 바이트 1 바이트
unsigned char 1 바이트 1 바이트
signed char 1 바이트 1 바이트
int 4 바이트 4 바이트
unsigned int 4 바이트 4 바이트
short 2 바이트 2 바이트
unsigned short 2 바이트 2 바이트
long 4 바이트 8 바이트
unsigned long 4 바이트 8 바이트
long long 8 바이트 8 바이트
unsigned long long 8 바이트 8 바이트
float 4 바이트 4 바이트
double 8 바이트 8 바이트
long double 12 바이트 (컴파일러에 따라 다름) 16 바이트 (컴파일러에 따라 다름)
_Bool 1 바이트 1 바이트
포인터 (Pointer) 4 바이트 8 바이트

 

  • 위 표는 일반적인 경우를 기준으로 합니다. 실제 메모리 크기는 사용하는 컴파일러와 플랫폼에 따라 달라질 수 있습니다.

 

자료형의 메모리크기는 `sizeof`를 사용할 수 있다. 

#include <stdio.h>

int main() {
    printf("Size of char: %zu bytes\n", sizeof(char));
    printf("Size of unsigned char: %zu bytes\n", sizeof(unsigned char));
    printf("Size of signed char: %zu bytes\n", sizeof(signed char));
    printf("Size of int: %zu bytes\n", sizeof(int));
    printf("Size of unsigned int: %zu bytes\n", sizeof(unsigned int));
    printf("Size of short: %zu bytes\n", sizeof(short));
    printf("Size of unsigned short: %zu bytes\n", sizeof(unsigned short));
    printf("Size of long: %zu bytes\n", sizeof(long));
    printf("Size of unsigned long: %zu bytes\n", sizeof(unsigned long));
    printf("Size of long long: %zu bytes\n", sizeof(long long));
    printf("Size of unsigned long long: %zu bytes\n", sizeof(unsigned long long));
    printf("Size of float: %zu bytes\n", sizeof(float));
    printf("Size of double: %zu bytes\n", sizeof(double));
    printf("Size of long double: %zu bytes\n", sizeof(long double));
    printf("Size of _Bool: %zu bytes\n", sizeof(_Bool));
    
    // 포인터 크기 출력
    int *p;
    printf("Size of pointer: %zu bytes\n", sizeof(p));

    return 0;
}

 

 

 

 

 

10. 정수 자료형을 명시하기 위해 상수 뒤에 붙이는 접미사 

 

C언어에서 정수 상수를 표현할 때 사용하는 접미사(suffix)는 정수의 타입을 명확히 하기 위해 사용됩니다. 접미사는 해당 상수가 어떤 정수 타입인지(예: long, unsigned, long long) 명시하는 데 사용됩니다. 아래는 주요 정수 자료형의 접미사와 그 사용 예시를 나타내는 표입니다:

 

자료형접미사예시

long L 또는 l 100L, 1234567890l
unsigned U 또는 u 100U, 250u
long long LL 또는 ll 123456789012LL, 9876543210ll
unsigned long UL 또는 ul 100UL, 4294967295ul
unsigned long long ULL 또는 ull 123456789012345ULL, 18446744073709551615ull

 

#include <stdio.h>

int main() {
    // 정수 리터럴 선언
    long a = 100L;
    unsigned int b = 250u;
    long long c = 123456789012LL;
    unsigned long d = 4294967295UL;
    unsigned long long e = 18446744073709551615ULL;

    // 크기와 값 출력
    printf("long: %ld, size: %zu bytes\n", a, sizeof(a));
    printf("unsigned int: %u, size: %zu bytes\n", b, sizeof(b));
    printf("long long: %lld, size: %zu bytes\n", c, sizeof(c));
    printf("unsigned long: %lu, size: %zu bytes\n", d, sizeof(d));
    printf("unsigned long long: %llu, size: %zu bytes\n", e, sizeof(e));

    return 0;
}

 

 

 

 

 

 

 

https://www.geeksforgeeks.org/unsigned-char-in-c-with-examples/

 

 

 

11. size_t 및 ptrdiff_t 자료형

size_t 자료형

  • size_t는 sizeof 연산자의 결과 타입으로, 메모리의 크기를 나타내는 데 사용됩니다. 이는 주로 배열의 크기, 문자열의 길이 등을 저장하는 데 사용되며, 부호 없는 정수형입니다.

ptrdiff_t 자료형

  • ptrdiff_t는 두 포인터 간의 차이를 나타내는 타입으로, 포인터 연산 결과를 저장하는 데 사용됩니다. 이는 일반적으로 부호 있는 정수형입니다.
#include <stdio.h>
#include <stddef.h>

int main() {
    int numbers[] = {10, 20, 30, 40, 50};
    size_t size = sizeof(numbers) / sizeof(numbers[0]);
    printf("Array contains %zu elements.\n", size);

    int *start = &numbers[0];  // 배열의 시작 포인터
    int *end = &numbers[4];    // 배열의 끝 S포인터
    ptrdiff_t diff = end - start;
    printf("Difference between pointers: %td elements.\n", diff);

    return 0;
}

 

 

 

 

 

12. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

'프로그래밍 > C언어' 카테고리의 다른 글

[C] 하드웨어, 운영체제, 프로그래밍 언어  (0) 2024.08.16
[C언어] 포인터  (0) 2023.05.13