C언어 기초 (2)

myblack·2025년 5월 6일

임베디드 STM32

목록 보기
2/11

입출력 코드

<stdio.h> 헤더파일에 정의

scanf : 입력문

변수 앞에 반드시 & 연산자(주소 연산자)를 사용

  • 형식 지정자(format specifiers):
형식설명예시 출력
%d10진수 정수10
%f실수3.14
%c문자'A'
%s문자열"hello"
%x16진수 (소문자)1a
%o8진수12
%p포인터 주소0x7ffe...

printf : 출력코드
콘솔(화면)에 출력

  • 형식 지정자(format specifiers):
형식설명
%d정수 입력
%f실수 입력
%c문자 입력
%s문자열 입력 (공백 이전까지)

연산자

산술 연산자 (Arithmetic Operators)

연산자의미예시결과
+덧셈3 + 25
-뺄셈3 - 21
*곱셈3 * 26
/나눗셈5 / 22 (정수 나눗셈)
%나머지5 % 21

대입 연산자

연산자의미예시동등 표현
=대입a = 5-
+=덧셈 후 대입a += 2a = a + 2
-=뺄셈 후 대입a -= 1a = a - 1
*=곱셈 후 대입a *= 3a = a * 3
/=나눗셈 후 대입a /= 2a = a / 2
%=나머지 후 대입a %= 2a = a % 2

증감 연산자 (Increment / Decrement)

연산자의미예시설명
++1 증가a++, ++a후위/전위
--1 감소a--, --a후위/전위

비교 연산자

연산자의미예시결과
==같다a == b1(참) 또는 0(거짓)
!=다르다a != b1 or 0
>크다a > b1 or 0
<작다a < b1 or 0
>=크거나 같다a >= b1 or 0
<=작거나 같다a <= b1 or 0

논리 연산자 (Logical Operators)

연산자의미예시결과
&&AND (둘 다 참)a > 0 && b > 01 or 0
``OR (하나라도 참)`a > 0b > 0`1 or 0
!NOT (부정)!a1이면 0, 0이면 1

비트 연산자 (Bitwise Operators)

연산자의미예시
&ANDa & b
``OR`ab`
^XORa ^ b
~NOT~a
<<왼쪽 쉬프트a << 1 (2배)
>>오른쪽 쉬프트a >> 1 (2로 나눔)
#include <stdio.h>

int main() {
    int a = 5;         // 00000101 (2진수)
    int left = a << 1; // 00001010 (5 * 2 = 10)
    int right = a >> 1;// 00000010 (5 / 2 = 2)

    printf("a << 1 = %d\n", left);   // 10
    printf("a >> 1 = %d\n", right);  // 2
    return 0;
}

조건 연산자 (Ternary Operator)
조건 ? 참일 때 실행 : 거짓일 때 실행;
int max = (a > b) ? a : b;

쉼표 연산자 (Comma Operator)
여러 문장을 한 줄에 나열할 때 사용 (순서대로 실행)
a = (b = 3, b + 2); // b=3 먼저, 그 후 b+2 → a=5

조건문

조건문은 프로그램이 상황에 따라 다른 명령을 실행하도록 할 때 사용
조건문은 주로 if, else if, else, 그리고 switch로 구성

조건문 종류설명
if조건이 참일 때 실행
if-else참/거짓 두 갈래 분기
else if여러 조건 판단 가능
switch변수 값에 따라 분기 (정수/문자형 주로)

if - else if - else 문

  • 설명
if (조건1) {
    // 조건1 참일 때 실행
} else if (조건2) {
    // 조건2 참일 때 실행
} else {
    // 모두 거짓일 때 실행
}
  • 예제
#include <stdio.h>

int main() {
    int num;

    printf("숫자를 입력하세요: ");
    scanf("%d", &num);

    if (num > 0) {
        printf("양수입니다.\n");
    } else if (num < 0) {
        printf("음수입니다.\n");
    } else {
        printf("0입니다.\n");
    }

    return 0;
}

switch 문 : 하나의 변수 값을 기준으로 여러 분기

  • 설명
switch (변수) {
    case 값1:
        // 값1일 때 실행
        break;
    case 값2:
        // 값2일 때 실행
        break;
    default:
        // 모두 해당 안 될 때 실행
}
  • 예제
#include <stdio.h>

int main() {
    int day;

    printf("요일 번호를 입력하세요 (1~7): ");
    scanf("%d", &day);

    switch (day) {
        case 1:
            printf("월요일입니다.\n");
            break;
        case 2:
            printf("화요일입니다.\n");
            break;
        case 3:
            printf("수요일입니다.\n");
            break;
        case 4:
            printf("목요일입니다.\n");
            break;
        case 5:
            printf("금요일입니다.\n");
            break;
        case 6:
            printf("토요일입니다.\n");
            break;
        case 7:
            printf("일요일입니다.\n");
            break;
        default:
            printf("1부터 7 사이의 숫자를 입력해주세요.\n");
    }

    return 0;
}

반복문

반복문(loop)은 조건이 참인 동안 동일한 코드 블록을 반복 실행하도록 하는 문법

문 종류반복 조건최소 1회 실행?
for반복 횟수 지정아니요
while조건 검사 → 반복아니요
do-while실행 → 조건 검사

for 문
반복 횟수가 명확할 때 사용 (예: 1~10까지 출력)

  • 구조
    for (초기식; 조건식; 증감식) {
    // 반복 실행할 코드
    }

  • 예제

#include <stdio.h>

int main() {
    for (int i = 1; i <= 5; i++) {
        printf("i = %d\n", i);
    }
    return 0;
}
  • 결과
i = 1
i = 2
i = 3
i = 4
i = 5

while 문
조건이 참이면 계속 반복. 반복 횟수가 불명확할 때 사용

  • 구조
    while (조건식) {
    // 반복 실행할 코드
    }

  • 예제

#include <stdio.h>

int main() {
    int i = 1;

    while (i <= 5) {
        printf("i = %d\n", i);
        i++;
    }

    return 0;
}

do-while 문
코드 블록을 최소 한 번은 실행한 후 조건 검사

  • 구조
    do {
    // 반복 실행할 코드
    } while (조건식);

  • 예제

#include <stdio.h>

int main() {
    int i = 1;

    do {
        printf("i = %d\n", i);
        i++;
    } while (i <= 5);

    return 0;
}

제어 키워드: break & continue
break: 반복문을 즉시 종료
continue: 다음 반복으로 건너뜀

함수

하나의 이름으로 정의된 작업 묶음
입력값(매개변수)을 받아 작업을 수행한 후, 결과값(반환값)을 돌려줄 수 있음

용어의미
반환형함수가 돌려주는 값의 자료형 (int, void)
함수 이름함수 호출 시 사용하는 이름
매개변수함수에 전달되는 입력값
return함수 결과를 호출한 쪽으로 돌려줌
void반환값이 없음을 의미
  • 구조
    반환형 함수이름(매개변수 목록) {
    // 실행할 코드
    return 반환값;
    }

예제 : 두 수 더하기 함수

int add(int a, int b) {
    return a + b;
}
#include <stdio.h>

// 함수 선언 (프로토타입)
int add(int, int);

int main() {
    int result = add(3, 5);
    printf("3 + 5 = %d\n", result);
    return 0;
}

// 함수 정의
int add(int a, int b) {
    return a + b;
}

반환값이 없는 함수 (void)

void greet() {
    printf("안녕하세요!\n");
}

매개변수가 없는 함수

int getNumber() {
    return 7;
}
  • ✅ 함수의 장점
    코드 재사용 (한 번 정의하면 여러 번 사용 가능)
    가독성 향상
    디버깅/유지보수 용이
    모듈화 (기능별로 나눌 수 있음)

  • ✅ 함수 사용 팁
    함수는 보통 main() 함수 외부에서 정의
    함수 선언은 main() 위에서 하거나 헤더 파일에 따로 분리 가능
    반환값이 없으면 void 사용

  • 함수 호출 시 전달 방식

방식설명예시
값에 의한 전달복사본 전달 (원본 변경 ❌)int add(int a, int b)
참조에 의한 전달주소값 전달 (원본 변경 가능 ⭕)void change(int *p)

배열 : 변수들의 집합
고차원 배열

포인터 : 데이터 주소값 보관하는 변수

구조체

서로 다른 데이터 타입을 하나의 그룹으로 묶을 수 있는 사용자 정의 자료형

//기본구조
struct 구조체이름 {
    데이터형 멤버1;
    데이터형 멤버2;
    ...
};
  • 구조체 변수 접근
struct Student s1;
  • 구조체 정의와 동시에 변수 선언
struct Student {
    char name[20];
    int age;
    float grade;
} s1, s2;
  • 구조체 멤버 접근
    문자열 복사는 strcpy()를 사용하고, <string.h>를 포함해야 함
strcpy(s1.name, "Alice");
s1.age = 20;
s1.grade = 4.3;

printf("%s, %d세, 학점: %.1f\n", s1.name, s1.age, s1.grade);
  • 구조체 예제
#include <stdio.h>
#include <string.h>

struct Student {
    char name[20];
    int age;
    float grade;
};

int main() {
    struct Student s1;

    strcpy(s1.name, "홍길동");
    s1.age = 22;
    s1.grade = 3.9;

    printf("이름: %s\n", s1.name);
    printf("나이: %d\n", s1.age);
    printf("성적: %.1f\n", s1.grade);

    return 0;
}
  • 구조체 배열
struct Student students[3];
students[0].age = 21;
strcpy(students[0].name, "김철수");

요약

기능문법 또는 키워드
구조체 정의struct
멤버 접근. 또는 ->
문자열 처리strcpy, strlen, ...
포인터로 전달struct Type *ptr
이름 간소화typedef 사용

구조체포인터

동적 메모리할당

링크드리스트

헤더파일

배열과 포인터

배열(Array)

배열은 같은 자료형의 값들을 연속적으로 저장하는 변수들의 모음

int arr[5] = {10, 20, 30, 40, 50};

arr[0] → 첫 번째 요소
arr[4] → 다섯 번째 요소

int arr[5];             // 정수형 배열
char name[20];          // 문자형 배열 (문자열)
float scores[3];        // 실수형 배열

포인터(Pointer)

포인터는 변수의 메모리 주소를 저장하는 변수입니다.

int a = 10;
int *p = &a;

p는 a의 주소를 저장
*p는 a가 저장된 주소의 값을 참조 (간접 접근)

주요 연산자

연산자의미예시
&주소 연산자&a → 변수 a의 주소
*간접 참조*p → 포인터 p가 가리키는 값

배열과 포인터의 관계

배열 이름은 포인터처럼 행동함

int arr[3] = {1, 2, 3};
int *p = arr;  // == &arr[0]

배열과 포인터 접근 비교

printf("%d\n", arr[1]);    // 2
printf("%d\n", *(p + 1));  // 2

즉, arr[i] == *(arr + i)

포인터 배열 순회

int arr[3] = {10, 20, 30};
int *p = arr;

for (int i = 0; i < 3; i++) {
    printf("%d\n", *(p + i));
}

포인터와 문자열

char *str = "Hello";
printf("%c\n", *(str + 1));  // e

이중 포인터

int a = 10;
int *p = &a;
int **pp = &p;

printf("%d\n", **pp);  // 10

요약

개념설명
배열같은 자료형의 데이터 집합
포인터변수의 주소를 저장하는 변수
arr[i]*(arr + i)와 동일
포인터 순회*(p + i) 형태로 배열 접근 가능
문자열문자 배열 = 포인터로 사용 가능

배열 포인터 차이점

구분배열포인터
크기 변경불가능 (고정 크기)가능 (malloc 등 사용)
주소 변경불가능 (배열 이름은 상수)가능 (p = other_ptr) 가능






Ref
Chatgpt

profile
기록과 분석, 이해

0개의 댓글