Shiny Star

강의 정리

[정보처리기사] 실기 프로그래밍 정리 - C언어

AnnieLoper 2025. 7. 5. 16:36

1. 포맷팅 및 연산

   1) int a = 10;

       printf("%d\n", a++) = 10

       printf("%d\n",a) = 11

   2) int b = 11;

        printf("%d\n",++b) = 12 

   3) 아스키코드 

       - 대문자와 소문자는 32의 차이가 난다. (대문자가 먼저)

       - char c = 'a' 

       - print("%c\n",c-32) = A

 

2. Switch - case 문 

    1) 해당하는 case 부터 break문 나올때까지 계속 출력 ** 

int main(){
 int num = 2;
 switch(num) {
 	case1: ~~~
    case2: ~~~
    case3: ~~~ break;
    default : ~~~}
   return 0
  }
  
  // case2, case3 이 출력됨.

 

 

3. 포인터(주소값)

  1) 주소 변수는 태어날 때, 별을 가지고 태어난다 

     - int *ptr1 = arr;

     - 주소값을 선언.

   2) 사용할때 별은 주소가 아니라 value를 나타낸다. 주소를 사용할때는 별을 붙이지 않음.

int main(){
	int arr[] = { 10,20,30,40,50 };
    int *ptr1 = arr; //태어날때 별은 주소값을 말한다.(가장 첫번째 값이 위치한 곳)
    int *ptr2 = &arr[2]; //&은 주소연산자. 변수앞에 붙이면 해당 위치값을 의미. 
    
    printf("value:%d\n",*(ptr1 + 2)); //ptr1의 주소값에 2번지를 더한 위치의 value.
    printf("value:%d\n",*ptr2);  //사용할 때 별은 value값을 의미한다.

}

  3) 구조체 포인터 저장변수는 int* p, 식으로 타입 이름 뒤에 붙인다. ex ) struct Node* next;

 

4. 배열

  1) 문자 배열

     - char types[][10] = {"Apple","Banana","Orange"};

     - 각 단어가 10글자 미만의 배열이라는 의미. types[0] = "Apple";

  2) 배열 길이

     - int arr[] = {1,2,3,4,5};

     - int *ptr = arr;

     - int number = sizeof(arr) / sizeof(arr[0]);

     // arr의 전체 길이를 1개의 arr의 길이로 나누면, 전체 배열의 갯수를 알 수가 있다. 

     // 예를 들어 sizeof(arr) = 50 이고 sizeof(arr[0]) = 5 이면 총 배열의 길이는 5.

 

5. 구조체 vs 구조체 포인터

  1) 구조체

struct Person{
	char name[20]; //20자까지
    int age;
};

struct Person p1 = {"Alice",25};
printf("%s is %d years old.", p1.name, p1.age);

//p1은 구조체 자체이기때문에 p1.으로 바로 접근이 가능하다.

  2) 구조체 포인터

struct Person{
	char name[20]; //20자까지
    int age;
};

struct Person p1 = {"Alice",25};
struct Person *ptr = &p1;
printf("%s is %d years old.", ptr ->name, ptr ->age);

//ptr은 p1의 포인터이기때문에 -> 로 접근.

    - 사용이유 ?

    - 구조체가 엄청나게 크면 복사하기 힘듬, 포인터 변수는 크기가 작음 등..

 

6. 비트연산자

  1) & 하나만

     - 앞 뒤를 이진수로 바꾼 이후, 두 비트가 모두 1일때만 1을 반환한다. 같은 자리수를 비교.

int a= 5;  //0101
int b = 3; //0011
int result = a&b; //0001

 2) | 하나 (OR)

     - 앞 뒤를 이진수로 바꾼 이후, 두 비트 중 하나만 1이어도 1을 출력. 같은 자리수를 비교.

int a= 5;  //0101
int b = 3; //0011
int result = a|b; //0111

 3) ^ 하나(XOR)

    - 앞 뒤를 이진수로 바꾼 이후, 두 비트가 다른 경우만 1을 출력. 같은 자리수를 비교.

int a= 5;  //0101
int b = 3; //0011
int result = a^b; //0110

 4) ~ 하나(NOT)

   - 하나의 값의 비트를 반전시킨다(0은1, 1은 0으로)

int a = 5; //0101
int result = ~a; //1010 인데 2의 보수어쩌고~ 로 -(a+1)로 외우면 된다.
//답은 -6

 5) 시프트 연산

   - << : 비트를 왼쪽으로 밀고, 오른쪽에 0을 채운다.

   - >> : 비트를 오른쪽으로 밀고, 왼쪽에 채움(양수는 0, 음수는 1)

int a = 3;      // 0000 0011
int b = a << 1; // 0000 0110 → 6

// a << n 은 a * 2^n 과 같음. 
// 3 << 1 = 3 * 2 = 6

int a = 8;      // 0000 1000
int b = a >> 2; // 0000 0010 → 2

// a >> n 은 a / 2^n과 같음.
// 8 >> 2 는 8 / 4 = 2

//활용예시
1. x << 3 // x * 8 	
2. x >> 2 // x/4
3. if((x>>3) & 1 ) {
 //	x의 4번째 비트가 1인지 확인 
 }