[깨알 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
}
}'자격증 공부 > 정보처리기사 실기' 카테고리의 다른 글
| [흥달쌤] 깨알 C언어) 2차원 배열과 포인터, 포인터 배열 (0) | 2026.06.07 |
|---|---|
| [흥달쌤] 깨알 C언어) 배열, 포인터, scanf와 변수, 배열과 포인터 (0) | 2026.06.03 |
| [흥달쌤] 깨알 C언어) IF문, SWITCH문, 반복문, FOR문, WHILE문(do~ while), 다중 FOR문 (0) | 2026.05.28 |
| [흥달쌤] 깨알 C언어) 연산자(+삼항 연산자), 출력 형식 (0) | 2026.05.10 |
| [흥달쌤] 깨알 C언어) 컴파일러, 인터프리터, 변수(종류와 유효 범위) (0) | 2026.05.03 |