정보처리기사

[정보처리기사] C 언어 정리

hminor 2023. 7. 12. 01:31

큰 정리는 아니지만 프로그램 문제 풀 때 주의할 점

 

C 언어

  • *p++
    • p++의 값으로 생각해서
    • 우선 p의 값을 조회하고 이후 p에 ++를 해줘야 한다.
  • 배열과 포인터는 똑같이 사용할 수 있다.
  • strcat(str1, str2)
    • strcat은 합치는 건데
    • str2를 str1 공간에 합쳐준다라는 의미가 됨
  • 포인터 배열
    • 기존 배열의 경우엔 아래와 같은 형식으로 구성
      • int arr[] = [123, 456, 789]
        • 그래서 123 은 임의의 값 100이라고 했을 때 456은 101, 789는 102라고 볼 수 있다.
    • 포인터 배열의 경우엔
      • char *c[] = {”aaa”,”bbb”,”ccc”} 와 같이 구성되어 있을 때
      • c는 포인터 배열로 배열의 주소값을 가지는 배열이라고 생각하면 될 듯하다.
      • 그래서 위의 경우엔 [’a’, ’a’, ’a’], [’b’, ’b’, ’b’], [’c’, ’c’, ’c’] 의 임의의 주소인 100, 200, 300 을 가지는 주소 배열인 [100, 200, 300]이 되는 것.
      • 그래서 문제처럼 *(c+1) 이라고 했을 때는 기존의 배열 처럼
        • c의 임의의 주소로 500이라고 했을 때의 값은 [100, 200, 300]에서 100이 되는 것이고 c+1이라고 했으니 501이어서 200을 가리키게 된다. 이후 200 번지의 값인 [’b’, ’b’, ’b’]의 값을 모두 출력하니 bbb가 된다
  • 배열 포인터
    • 뒤에 있는 상수값을 가지고 배열 구조를 재구조화 시키는 것을 의미한다고 한다.
    • ex)int (*in)[N] =⇒> N이 3의 경우 3열 짜리 2차원 배열로 만들어라는 의미
    • 이후 in = (int(*)[N] malloc(N x N x sizeof(int)) 라고 했을 때
    • N이 3이라고 했으니 3*3인 9개의 int로 된 1차원 배열을 malloc을 사용해 동적으로 할당하라는 의미가 된다.
    • 그런데 in은 배열 포인터로 3열짜리 2차원 배열로 만들어라고 했으니 3행 3열인 2차원 배열이 된다.
      • 만약 x = (int(*)[N] malloc(N x N x sizeof(int)) 라고 한다면 그냥 9개의 칸을 가지는 1차원 배열이 된다.
    • 다시 정리
      • int (*p)[3]의 경우엔 3열짜리 배열을 만들어라는 의미
      • 그리고 2차원 배열의 p가 있고 100번지라고 할 때 p라고 하면 100번지의 값을 가리키는 것이 아닌 100번지 주소를 가리키게 된다. 그래서 p+1이라고 하면 101번지의 주소를 가리키는 게 아니라 2차원 배열의 그 다음 번째 인덱스를 가리키게 된다.
      • ex) [[1,2,3],[4,5,6]]의 경우 p는 100이고, [1,2,3] 또한 100이고 [4,5,6]은 103번지가 된다.
      • 근데 여기서 p+1이라고 하면 101번지가 아닌 103번지의 값을 가지게 된다.
  • 구조체
    • 기본적으로 구조체는 아래와 같이 struct로 생성
    • struct person u1 { char *name; int age}
    • 이후 생성자를 만들어 낼때 두 가지 방법이 있다.
      • 두 번째는 포인터를 사용하는 것으로 첫 번째와 다른 점은 u1.name을 u2 → name 이렇게 변경하는 것 말고는 차이가 없다
      • struct person u1 u1.name = “A” u1.age = 30
      • struct person *u2 u2 → name = “B” u2 → age = 40
  • 구조체2
    • struct list { int *fp; } data, *p 라고 정의 한다면
    • data와 *fp 모두 *fp를 가진 생성자로 사용하면 되는 것 같다.
    • 그러면 임의의 주소값인 data는 300, *p는 400 이라고 했을 때
      • 만약 p = &data 라고 하면 data의 주소값인 300을 p에 넣다보니 기존의 *p의 주소값인 400을 대신해 data의 300을 넣게 되어 기존의 p는 data와 같게 되어 data의 *fp 값을 같이 참조하게 된다.
  • 구조체3
    • struct person { char name[10]; int age; } 라고 되어 있을 때
    • struct person s[] = {’a’, 1, ’b’, 2, ’c’, 3, ’d’, 4}라고 하면 그냥 4행짜리 2차원 배열이 만들어진다고 생각할 수 있다.
  • 함수의 유효 범위
    • ex) int a = 10 int main() { int a = 5 ps(); printf(’%d\n”, a) return 0 }
    void ps(){ printf(’%d\n”, a}
    • 라고 하면 ps는 main() 안에서 실행이 되었지만 안에서 작동하는것이 아니기에 전역변수 a 인 10을 출력하게 되고, 이후 main 안에서 실행한 printf 는 5를 출력한다.
  • fork()
    • 생성에 실패 했을 경우: return 음수 (-)
    • 자식 프로세스: return 0
      • 자식 프로세스가 생성되었을 경우 자식이 하나 생성되었기에 새롭게 처음부터 다시 실행을 추가로 한다고 기억하기
      • 다만 실행 순서는 부모 → 자식 순으로 한다.
        • 여기서 또 부모에서 wait() 메서드가 있다면 자식부터 실행하고 돌아오기
    • 부모 프로세스: return 양수 (+)