자격증 공부/정보처리기사

[정보처리기사실기] 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"

 

연산자 의미
. 구조체 변수로 직접 접근
-> 구조체 포인터로 접근할 때 사용