[C] 열거형, 상수 포인터

방법이있지·2025년 6월 20일

[정글 4-8주차] C언어

목록 보기
21/26

전혀 관련없어 보이는 두 주제를 함께 다룬 이유는.... 이번 실습에 두 개념을 활용해야 하더군요.

차피 놓친 개념은 다시 공부해야 해서, 한 글로 적었습니다.

열거형

  • 변수에 정의할 수 있는 정수 값을, 기호로 정의해서 나열
// 열거형 선언: 중괄호 내 멤버를 콤마로 나열
typedef enum _food {MANDU, PASTA, CHEESECAKE, ICECREAM} Food; 
// MANDU는 0, PASTA는 1, CHEESECAKE은 2, ICECREAM은 3

Food f;             // 열거형 변수 선언
char *pc = NULL;    // 문자열을 저장할 포인터

f = MANDU;          // 열거형 변수에 값 대입 (실제론 0)

switch (f){
    case MANDU:         // 실제론 case 0
        pc = "비비고 김치 만두"; 
        break;
    case PASTA:         // 실제론 case 1
        pc = "봉골레 파스타";
        break;
    case CHEESECAKE:    // 실제론 case 2
        pc = "필라델피아 치즈 케이크";
        break;
    case ICECREAM:      // 실제론 case 3
        pc = "나뚜르 녹차 아이스크림";
        break;
}

printf("오늘 점심 메뉴는 %s\n", pc);
// [출력] 오늘 점심 메뉴는 비비고 김치 만두
  • 열거형 선언 시, 컴파일러는 멤버를 차례로 0부터 시작하는 정수 값으로 바꿈
    • MANDU0, PASTA1, CHEESECAKE2, ICECREAM3
    • 이후 열거형에 멤버를 저장하면, 위의 정수로 해석됨
  • 열거형 변수에는 int형과 같은 크기로, 정수를 저장할 수 있음
  • 초기값을 원하는 값으로 설정 가능
    • enum _food {MANDU = 13, PASTA, CHEESECAKE = 30, ICECREAM};
    • 이 경우, 값이 설정되지 않은 멤버는 이전 멤버보다 하나씩 큰 정수로 바뀜
    • PASTA14, ICECREAM31으로 해석됨

상수 포인터

  • const 예약어를 포인터에 사용하면, 간접 참조 연산자(*)를 이용해 가리키는 변수의 값을 바꿀 수 없음
int a = 303, b = 216;
const int *pi = &a;

*pi = 404;		// 간접 참조 연산 수행해서 값 수정 불가능
printf("*pi: %d\n", *pi);

// [실행결과] error: assignment of read-only location ‘*pi’
  • 단, 포인터가 저장한 주소는 수정할 수 있음
  • * 없이, 직접 가리키는 변수에 값을 대입하는 것 역시 여전히 가능
int a = 303, b = 216;
const int *pi = &a;

printf("*pi: %d\n", *pi);   // *pi: 303
pi = &b;					// 포인터가 저장한 주소는 수정 가능
printf("*pi: %d\n", *pi);   // *pi: 216
pi = &a;
a = 404;					// 직접 가리키는 변수에 값을 대입하는 것 역시 가능
printf("*pi: %d\n", *pi);   // *pi: 404
profile
뭔가 만드는 걸 좋아하는 개발자 지망생입니다. 프로야구단 LG 트윈스를 응원하고 있습니다.

0개의 댓글