Tiny Hand

잡다한거/자격증

난 정처기 이거만 공부한다 - C언어

김가네코딩 2025. 11. 7. 02:20

우선 전 

 

'정보처리기사/정처기 코딩 꿀팁' 카테고리의 글 목록

코딩하는 백수입니다

complainrevolutionist.tistory.com

여기를 참고해서 코딩 공부를 할 예정입니다!

 

학부 때 Python 조금 해보고

지금은 SSAFY에서 자바반인데... 정처기 문제는 너무 어려워서

C부터 조금씩 더 공부해볼 예정입니다!!

 

시험 같이 준비해요~!

 

참고로 누구 보여주려고 하는 게 아니고

제가 공부하려고 정리하는 거라 너무 기본적인 것들은 다 뺐습니다.


1. 출력

#include<stdio.h>     
int main() {
    printf("안녕");
    printf("안녕");
    printf("안녕");
    return 0;
}

안녕안녕안녕으로 출력된다. 

그러면 

안녕
안녕
안녕

으로 출력하고 싶으면

줄 바꿈 기호("\n")을 넣으면 된다.

#include<stdio.h>     
int main() {
    printf("안녕\n");
    printf("안녕\n");
    printf("안녕\n");
    return 0;
}

2. 증감연산자

#include<stdio.h>     
int main() {
    int a = 10;
    int b = 15;
    int c = a++ + --b;
    int d = ++a + b--;


    printf("%d\n",a); // 10
    printf("%d\n", b);  // 15
    printf("%d\n", c);  // c
    printf("%d", d); 	// d
    return 0;
}

 

c = 10 + 14

d = 11 + 15

 

전치연산자는 바로 계산된다
후치연산자는 그 다음 라인부터 계산된다

 

3. 비트 연산자

& 는 둘 다 true일 때만 true

^ 는 두 개가 다를 때 true

| 는 둘 중 true여도 true

 

>>는 비트를 이동시키는 연산자

ex) 8<< 2

8에서 2의 제곱만큼 나눠준다

ex) 8>>2

8에서 2의 제곱만큼 나눠준다.


4. 조건문

기본 if-else 조건문은 생략

 

switch-case문

#include<stdio.h>
int main() {
	int num = 3;
	switch (num) {
	case 1:
		printf("안녕1");
		break;
	case 2:
		printf("안녕2");
		break;
	case 3:
		printf("안녕3");
		// break; 이거 있으면 여기서 끝!
 
	default : 
		printf("안녕안녕");
		break;
	} 
		return 0;
}

3이니까 case 3 출력

break;


5. 반복문

for, while, do-while문이 있다.

나머지는 다 아니까 do-while만 보자

#include<stdio.h>
int main() {
 
	int i = 0;
	do {
		printf("%d", i);
		i++;
	} while (i <= 5);
	
	return 0;
}

조건 중괄호 { } 블럭을 한번 실행하고, 조건을 검사하여 반복을 결정한다.


6. 배열

#include<stdio.h>
int main() {
	char a[6] = "KOREA";
	printf("%s", a);
	return 0;
}

이렇게도 된다고? 신기하다!

ㄴ 이유 : a라는 배열의 이름은 배열의 주소를 가리키기 때문이다

 

2차원 배열은 자바랑 크게 다르지 않아서 생략하겠다.


7. 함수

사진 출처 : https://m.blog.naver.com/sung_mk1919/221584139026

7-1. 파라미터

int sum (int x, int y){
	int result = 0;
    result = x + y;
    return result;
 }

return이 필수!!

void sum (int x){
	int a = x;
    printf("%d", %a);
 }

7-2. 변수

(1) 지역 변수

main() 함수, 조건문, 반복문의 중괄호 내부와 함수의 매개 변수로 사용되는 변수

#include<stdio.h>
int hello(void);
 
int main() {
	int k = 20;
	
	printf("%d\n",hello()); 
    printf("%d", k);   
    
	return 0;
}
 
 
int hello(void) {
	int k = 100;
	return k;
}

hello()에서 k는 100이라서 100출력!

main 안에서 k니까 20출력!

(2) 정적 변수

#include<stdio.h>
void hello(void);
 
int main() {
	int k = 20;
	
	hello();
	hello();
	hello();
 
	return 0;
}
 
 
void hello(void) {
	static k = 1;
	int t = 0;
	k++;
	t++;
	printf("%d %d\n", k, t);
}

hello() -> 2 1

hello() -> 3 1

hello() -> 4 1

 

→ static k라서 정적 변수!

7-3. 재귀 함수

함수 내에서 자기 자신을 호출하는 함수

#include<stdio.h>
int fact(int);
 
int main() {
	int a=4;
	printf("%d",fact(a));
	return 0;
}
 
int fact(int n) {
	if (n <= 1)
		return 1;
	else
		return n * fact(n-1);
}

fact(4)

4 * fact(3)

4 * ( 3*fact(2))

4 * ( 3 * (2 * fact(1)))

4 * ( 3 * (2 * 1) = 24


8. 포인터 ★

포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부른다.

 

1) 주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.

 

2) 참조 연산자(*)
참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다.

dereference라고 하여 역참조연산자라고도 한다.

#include <stdio.h>
 
int main() {
  int a=3;
  int b=&a;
  int *c=&a;
  printf("%d\n",a); //그냥 변수 a를 출력
  printf("%d\n",b); //b에 저장된 a의 주소의 값을 출력
  printf("%d\n",c); //포인터 변수 c에 저장된 a의 주소 출력
  printf("%d\n",*c); //포인터 변수 c에 저장된 a의 주소의 값 출력
  return 0;
}

printf("%d",a); //출력 결과 : 3

printf("%d",b); //출력 결과 : 1000K

printf("%d",c); //출력 결과 : 1000K

printf("%d",*c); //출력 결과 : 3

 

3) 다차원 포인터

#include <stdio.h>
 
int main() {
  int a=3;
  int* b=&a;   //1차원 포인터 : 변수의 주소값 저장
  int** c=&b;  //2차원 보인터 : 1차원 포인터의 주소값 저장
  
  printf("%d\n",b);  //8행과 9행 동일
  printf("%d\n",*c);  // 결과값 : a의 주소
  
  printf("%d\n",*b);  //11행과 12행 동일
  printf("%d\n",**c); //결과값  : 3
  return 0;
}

포인터 변수 b는 a의 주소를 가리키기 때문에 

b는 a의 주소이고

*b는 a의 값이다

 

포인터 변수 c는 b의 주소를 가리키기 때문에

c는 b의 주소이고

*c는 b의 값인데 b의 값이 a의 주소이므로 *c는 a의 주소이다.

*c가 a의 주소이므로 **c는 a의 주소의 값(즉, a의 값)이다 

#include <stdio.h>
 
int main(){
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
 
printf("%d\n", *arr[1] + **arr + 1);
}

 

*arr[1]은 arr[1]의 값 arr[1]이 b의 주소를 가리키므로 

b의 주소의 값(b의 값) = 24 

*arr은 a의 주소이고 

**은 a의 주소의 값(a의 값) =12

 24+12+1=37

9. 심화 ★

C언어본색-박정민

#include <stdio.h>
 
int main() {
	int a = 10, b = 20, c = 30;
	int* p[3] = {&a,&b,&c};
	printf("%d\n", *p[0]); //10
	printf("%d\n", *p[1]);  //20
	printf("%d\n", *p[2]);  //30
	printf("%d\n", **(p+0)); //10
	printf("%d\n", **(p+1)); //20
	printf("%d\n", **(p+2));  //30
 
	return 0;
}
#include <stdio.h>
 
int main() {
	char array[4] = "ABC";
	printf("%s\n", array);  //ABC 출력
	printf("%s\n", array+1); //BC 출력
	printf("%s\n", array+2);  //C 출력
	return 0;
}
#include <stdio.h>
 
int main() {
	char array[4] = "ABC"; //배열 방식
	printf("%s\n", array); // ABC
	printf("%s\n", array+1); // BC
	printf("%s\n", array+2); // C
 
	char* p = "ABC";  //포인터방식
	printf("%s\n", p);
	printf("%s\n", p + 1);
	printf("%s\n", p + 2);
	return 0;
}