본문 바로가기

C

[C언어] const

반응형
const int *p;        // 읽기 전용 포인터(주소 변경 가능, 값 변경 불가능)
int* const p;        // 특정 변수 전용 포인터(주소 변경 불가능, 값 변경 가능)
const int* const p;

#include<stdio.h>

int main(){

   int x = 10, y = 20;

   const int* p1 = &x;    // pointer p는 '읽기 전용 포인터'이다. 포인터를 이용해서 값을 변경할 수 없다.
                         // 포인터가 가리키는 주소는 변경할 수 있지만, 그 안에 저장된 값은 바꿀 수 없다.
                         // == (int const *p1)
   printf("*p1 = %d\n", *p1);
   x = 30;    // 직접 변경이 가능하다.
   printf("*p1 = %d\n", *p1);
   // *p1 = 20;   // (오류) 컴파일 에러, 포인터 변수를 이용하여 값을 변경할 수 없다.
   // (*p1)++;    // (오류) 포인터 변수를 이용하여 값을 변경할 수 없다.
   p1 = &y;       // 주소값은 바꿀 수 있다.
   printf("*p1 = %d\n\n", *p1);

   int* const p2 = &x;   // 특정 변수 전용이다. 주소를 변경할 수 없다.
   printf("*p2 = %d\n", *p2);
   x = 40;    // 직접 변경이 가능하다.
   printf("*p2 = %d\n", *p2);
   *p2 = 20;     // 포인터 변수를 이용하여 저장된 값을 변경할 수 있다.
   printf("*p2 = %d\n", *p2);
   (*p2)++;   // 포인터 변수를 이용하여 저장된 값을 변경할 수 있다, (*p2)의 값에 '+1'을 한 값이 출력된다.
   // p2 = &y;   // (오류) 주소값을 변경할 수 없다.
   printf("*p2 = %d\n\n", *p2);

   const int* const p3 = &x;
   printf("*p3 = %d\n", *p3);
   x = 30;    // 직접 변경이 가능하다.
   // *p3 = 100;   // (오류) 포인터 변수를 이용하여 저장된 값을 변경할 수 없다.
   // (*p3)++;     // (오류) 포인터 변수를 이용하여 저장된 값을 변경할 수 없다.
   // p3 = &y;     // (오류) 주소 값을 변경할 수 없다.
   printf("*p3 = %d\n\n", *p3);
   
   return 0;
}

 

반응형