본문 바로가기
자격증 공부/정보처리기사 실기

[흥달쌤] 깨알 C언어) 구조체, 배열포인터, 함수, 함수와 반복문

by mekite 2026. 6. 14.

[깨알 C언어 35~38 영상]

 

※ 구조체(Structure)란?

   • 서로 다른 자료형의 변수들을 하나로 묶어 하나의 객체처럼 다루기 위한 사용자 정의 자료형

 

※ 구조체 구성

struct 구조체명
{
    멤버변수1;
    멤버변수2;
};

 

※ 구조체 정의 및 사용

struct person
{
    char *name;  // 문자열을 가리키는 포인터
    int age;     // 나이 저장
};

struct person user1;  // person 구조체 변수 생성

user1.name = "h user";
// user1의 name 멤버에 "h user" 문자열의 시작 주소 저장

printf("%s", user1.name);
// user1.name이 가리키는 문자열 출력
// 결과: h user
struct person
{
    char *name;  // 문자열 주소 저장
    int age;     // 나이 저장
} test;
// 구조체 정의와 동시에 test 변수 생성

test.name = "h user";
// name 멤버에 "h user" 문자열 주소 저장

test.age = 40;
// age 멤버에 40 저장

printf("%s : %d", test.name, test.age);
// test.name → "h user"
// test.age → 40
// 결과: h user : 40



/* 포인트!! */
struct person
{
    ...
} test;
은
struct person
{
    ...
};

struct person test;
와 동일하다
즉, 구조체를 정의하면서 바로 변수(test)까지 생성한 형태이다.
struct person
{
    char *name;  // 문자열 주소 저장
    int age;     // 나이 저장
};

struct person *p;
// person 구조체를 가리키는 포인터 선언

p->name = "test_2";
p->age = 40;

printf("%s : %d", p->name, p->age);

 


 

[] 다음 C 프로그램의 실행 결과로 옳은 것은?

#include <stdio.h>

int main(){
    struct list {
        int *fp;
    } data, *p;

    int x[] = {100, 200, 300, 400};

    p = &data;
    p->fp = x + 1;

    printf("%d", *(++p->fp));

    return 0;
}

 

① 100    ② 200    ③ 300    ④ 400

 

→ ③ 300

 

| 인덱스 |  값 |
| ----- | --- |
| x[0]  | 100 |
| x[1]  | 200 |
| x[2]  | 300 |
| x[3]  | 400 |


// 포인터 이동
p->fp = x + 1;    // x+1 → x[1] | p->fp → 200

++p->fp
// 포인터를 먼저 1칸 이동 x[1] → x[2]

*(++p->fp)
↓
*(x+2)
↓
x[2]
↓
300


// 출력 결과 : 300

 


 

※ 배열 포인터(Array Pointer)란?

  • 배열 전체를 가리키는 포인터
일반 포인터 vs 배열 포인터
선언 int *p; int (*p)[3];
의미 int 1개를 가리키는 포인터 int 3개짜리 배열을 가리키는 포인터
int (*in)[2];

int num[3] = {1, 2, 3};

in = num;

printf("%d\n", in);
printf("%d\n", num);
printf("%d\n", *in);



/* 포인트!! */
int (*in)[2];
→ 정수 2개짜리 배열을 가리키는 배열 포인터
int (*in)[4];

int num[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
};

in = num;


printf("%d", **in);        // 1
printf("%d", *(*in+1));    // 2
printf("%d", **(in+1));    // 5



/* 포인트!! */
int (*in)[4];
→ 정수 4개짜리 배열을 가리키는 배열 포인터

 


 

[] 다음 C 프로그램의 실행 결과로 옳은 것은?

#include <stdio.h>
#include <stdlib.h>

#define N 3

int main(void){
    int (*in)[N], *out, sum = 0;

    in = (int (*)[N])malloc(N * N * sizeof(int));
    out = (int *)in;

    for(int i = 0; i < N * N; i++)
        out[i] = i;

    for(int i = 0; i < N; i++)
        sum += in[i][i];

    printf("%d", sum);
    return 0;
}

 

→ 12

 

#include <stdio.h>
#include <stdlib.h>

#define N 3

int main(void){
    int (*in)[N], *out, sum = 0;

    // int 9개(3×3) 크기의 메모리 동적 할당
    in = (int (*)[N])malloc(N * N * sizeof(int));

    // 같은 메모리를 1차원 배열처럼 접근하기 위한 포인터
    out = (int *)in;

    // 0~8 저장
    for(int i = 0; i < N * N; i++)
        out[i] = i;

    /*
        메모리 상태

        in[0][0] = 0   in[0][1] = 1   in[0][2] = 2
        in[1][0] = 3   in[1][1] = 4   in[1][2] = 5
        in[2][0] = 6   in[2][1] = 7   in[2][2] = 8
    */

    // 대각선 요소 합산
    for(int i = 0; i < N; i++)
        sum += in[i][i];

    /*
        i=0 → in[0][0] = 0
        i=1 → in[1][1] = 4
        i=2 → in[2][2] = 8

        sum = 0 + 4 + 8 = 12
    */

    printf("%d", sum);
    // 출력 결과: 12

    return 0;
}

 

* 나중에 다시 봐야 할 듯...

https://youtu.be/BNI7dq8MVww?si=WYie4oM2EmX7AQNr

 


 

※ 함수(Function)란?

  • 반복해서 사용하는 코드를 묶어놓은 작은 프로그램 단위

 

※ 함수 기본 구조

반환타입 함수명(매개변수)
{
    실행할 코드
}

 

※ 함수 선언과 사용

int sum(int a, int b)
{
    int c = a + b;

    return c;
}

int data = sum(10, 20);

printf("%d", data);



// 실행 과정

int sum(int a, int b)
{
    int c = a + b;   // c = 10 + 20 = 30

    return c;        // 30 반환
}

int data = sum(10, 20);
// data = 30 저장

printf("%d", data);
// 출력: 30

 


 

[] 다음 C언어 프로그램의 실행 출력 결과로 옳은 것은?

#include <stdio.h>

void swap(int a, int b) {
    int temp;

    temp = a;
    a = b;
    b = temp;
}

int main(void){
    int k, j;

    k = 3;
    j = 2;

    swap(k, j);

    printf("k = %d, j = %d", k, j);

    return 0;
}

 

① k=3, j=2
② k=2, j=3
③ k=2, j=2
④ k=3, j=3

 

→ ① k=3, j=2

 

void swap(int a, int b) {
    int temp;

    temp = a;  // temp=3
    a = b;     // a=2
    b = temp;  // b=3

    // a,b는 swap 함수 내부의 지역 변수
    // 원본 k,j는 변경되지 않음
}

int main(void){
    int k, j;

    k = 3;
    j = 2;

    swap(k, j);
    // a=3, b=2가 복사되어 전달됨
    // 함수 종료 후 k=3, j=2 그대로 유지

    printf("k = %d, j = %d", k, j);
    // 출력: k=3, j=2

    return 0;
}

 


 

[] 다음 C 언어 프로그램의 출력 값은?

#include <stdio.h>

int func(int n);

int main(void){
    int num;

    printf("%d\n", func(5));

    return 0;
}

int func(int n){
    if(n < 2)
        return n;
    else{
        int i, tmp, current = 1, last = 0;

        for(i = 2; i <= n; i++){
            tmp = current;
            current += last;
            last = tmp;
        }

        return current;
    }
}

 

→ 5

 

#include <stdio.h>

int func(int n);

int main(void){
    int num;

    printf("%d\n", func(5));
    // func(5) 호출
    // 반환값: 5
    // 출력: 5

    return 0;
}

int func(int n){
    if(n < 2)
        return n;
    else{
        int i, tmp, current = 1, last = 0;
        // current=F(1), last=F(0)

        for(i = 2; i <= n; i++){

            tmp = current;

            current += last;
            // i=2 → current=1
            // i=3 → current=2
            // i=4 → current=3
            // i=5 → current=5

            last = tmp;
        }

        return current;
        // 반환값: 5
    }
}