자격증 공부/정보처리기사
[정보처리기사실기] C언어 관련 개념 정리( 포인터, 구조체 )
강_토발즈
2025. 7. 2. 21:39
1. 포인터란?
일반 변수는 **값(value)**를 저장하지만, 포인터는 **그 값이 저장된 메모리 위치(주소)**를 저장한다.
1-1 왜 포인터를 사용할까?
- 메모리에 직접 접근할 수 있다
보통 변수는 값을 직접 다루지만, 포인터는 그 값이 지정된 메모리의 주소를 직접 조작할 수 있다. 따라서 변수 없이도 컴퓨터 속의 특정 위치를 직접 조작할 수 있다. 이는 효율적으로 메모리와 하드웨어를 관리할 수 있고 저수즌 시스템 프로그래밍이 가능하게 한다. - 함수에서 값을 수정할 수 있다.
함수를 사용하면, 변수의 값을 복사해서 전달하기 때문에 원본의 값은 변하지 않는다. 하지만 포인터를 넘겨주면 주소를 전달하고, 이는 함수 안에서 진짜 변수 값 자체를 바꿀 수 있다. 따라서 함수를 통해 원본의 값을 바꿔야 하는 경우에 포인터를 전달하는 식으로 프로그래밍 하면, 효율적으로 프로그래밍 할 수 있다. - 동적 메모리 할당이 가능하다.
고정된 크기의 배열과는 달리, 함수를 통해 실행 도중 필요한 만큼 메모리를 만들 수 있고, 이후 메모리를 다시 반환할 수도 있다. 이는 효율적인 메모리 사용을 가능하게 한다. ( malloc , free )
1- 2. 포인터 선언 방법
int *p;
- p는 int형 변수의 주소를 저장할 포인터이다
- *는 “포인터 변수”임을 표시 한다.
1-3. 예제
#include <stdio.h>
int main() {
int x = 10;
int *p = &x; // p는 x의 주소를 저장
printf("x의 값: %d\n", x); // 10
printf("x의 주소: %p\n", &x); // 예: 0x7ffc12345678
printf("p의 값(주소): %p\n", p); // x의 주소와 동일
printf("*p의 값: %d\n", *p); // x의 값 = 10
*p = 20; // p가 가리키는 메모리의 값을 20으로 바꿈
printf("x의 새 값: %d\n", x); // 20
return 0;
}
변수 | 설명 |
x | 정수 값 10을 저장하는 변수 |
p | x의 주소를 저장하는 포인터 |
*p | p가 가리키는 곳의 값 (x) |
→ 즉, *p = 20은 x = 20과 같은 의미!
1- 4. 정리
표현 | 의미 |
&x | 변수 x의 주소 |
*p | 포인터 p가 가리키는 값 |
int *p | int형 주소를 저장하는 포인터 변수 선언 |
2. struct (구조체) 란?
서로 다른 **자료형(타입)**을 가진 변수들을 하나의 그룹으로 묶는 것. 즉, **“사용자 정의 자료형”** 이 구조체의 개념이다.
2-1. 왜 구조체를 사용할까?
예를 들어, 학생 정보를 저장할 때
- 이름 (문자열)
- 나이 (정수)
- 평균 점수 (실수)
이런 다양한 타입의 데이터를 한 변수처럼 묶고 싶을 때 사용한다.
2-2. 기본 문법
struct 구조체이름 {
데이터타입 멤버이름;
...
};
2-3. 간단한 예제
#include <stdio.h>
struct Student {
char name[20];
int age;
float grade;
};
int main() {
struct Student s1 = {"Alice", 20, 92.5};
printf("이름: %s\n", s1.name);
printf("나이: %d\n", s1.age);
printf("성적: %.1f\n", s1.grade);
return 0;
}
2-4. 접근 방식 요약
표현 | 접근 |
s1.name | 구조체 s1의 name 멤버 접근 |
s1.age | 구조체 s1의 age 멤버 접근 |
s1.grade | 구조체 s1의 grade 멤버 접근 |
2-5. 포인터와 함께 쓰기
struct Student s = {"Bob", 22, 88.0};
struct Student *ptr = &s;
printf("%s\n", ptr->name); // → "Bob"
연산자 | 의미 |
. | 구조체 변수로 직접 접근 |
-> | 구조체 포인터로 접근할 때 사용 |