본문 바로가기
Study/C언어

C언어 - const의 포인터 이용

by 멘탈은안녕하신가 2018. 12. 10.
728x90
반응형
  • const : const 키워드를 갖는 것(변수 등)을 상수화한다.
  • const int * ptr = &num 과 int * const ptr = &num 등 여러가지 비교(int num = 10 이라 가정)

1. const int * ptr(=int const *ptr) = &num (포인터 앞에 const가 올 때)


- 포인터(*ptr)를 상수화하는 것으로, 포인터(*ptr)를 이용한 연산을 수행 할 수 없다.

 
  • 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main(void )
{
 
                int num1 = 10;
                int num2 = 20;
                const int * ptr = &num1; // 포인터(*ptr)를 상수화.
                printf"*ptr = %d, \n"*ptr);
 
                // * ptr = &num2 는 포인터(*ptr)가 상수화 되었기 때문에 컴파일 에러가 발생.
 
                ptr = &num2; // ptr을 이용하여 가리키는 위치를 바꿔줄 수는 있다.
                                       // ptr = &num2 는 num2의 주소를 변수 ptr에 넣는 것이다. 따라서 ptr을 출력하면 num2의 주소가 나온다.
 
                printf("*ptr = %d, num1 = %d, num2 = %d, \n"*ptr, num1, num2);
                num2 = 30// 대상 메모리(num1,num2)를 이용한 연산에도 아무 문제가 없다.
                printf"*ptr = %d, num1 = %d, num2 = %d, \n" , *ptr, num1, num2);
 
}
 
cs

 

  • 결과

 

2. int * const ptr = &num(포인터 뒤에 const가 올 때)

 

- 포인터 변수(ptr)를 상수화 하는것으로, 포인터 변수(ptr)를 이용한 대입 연산을 사용 할 수 없다.

- 포인터 변수(ptr)가 상수라는것은 주소가 저장되면 그 값의 변경이 불가능하다는 것이다. 즉 한번 가리킨 변수는 값이 변해도 끝까지 가리킨다.

 

  • 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main(void )
{
 
                int num1 = 10;
                int num2 = 20;
                int * const ptr = &num1; // 포인터(*)가 아닌 포인터 변수 ptr을 상수화.
                                                          // 포인터 변수(ptr)가 상수라는 것은 주소가 저장되면 그 값의 변경이 불가능하다는 뜻이다.(= 한번 가리킨 변수를 끝까지 기리킨다.)
                printf"*ptr = %d\n"*ptr);
                *ptr = num2; // 1번과는 다르게 포인터(*ptr) 연산이 가능하다.
 
                // ptr = &num2 는 포인터변수(ptr)가 상수화 되었기 때문에 컴파일 에러가 발생.
 
                printf"*ptr = %d, num1 = %d, num2 = %d, \n" , *ptr, num1, num2);
 
                num2 = 30// 1번과 마찬가지로 대상 메모리(num1,num2)를 이용한 연산에도 아무 문제가 없다.
                                  // 하지만 포인터 변수(ptr)이 상수화 되었기 때문에 값은 20에서 변하지 않는다.
                printf"*ptr = %d, num1 = %d, num2 = %d, \n" , *ptr, num1, num2);
 
}
 
cs

 

  • 결과

 

 

3. const int * const ptr = &num (포인터의 앞과 뒤에 const가 올 때)

 

- 포인터(*ptr)와 포인터 변수(ptr)이 모두 상수화 되었기 떄문에 포인터(*ptr)와 포인터 변수(ptr)를 이용한 연산이 불가능하다.

 

  • 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main(void )
{
 
                int num1 = 10;
                int num2 = 20;
                const int * const ptr = &num1; // 포인터(* ptr)와 변수 ptr 모두 상수화.
                printf"*ptr = %d\n"*ptr);
 
                /*
                * ptr = num2와 ptr = &num2의 ptr과 *ptr이 상수화 되었기 때문에 컴파일 에러 발생.
                */
 
                printf"*ptr = %d, num1 = %d, num2 = %d, \n" , *ptr, num1, num2);
 
                num2 = 30// 1,2번과 마찬가지로 대상 메모리(num1,num2)를 이용한 연산에도 아무 문제가 없다.
                printf"*ptr = %d, num1 = %d, num2 = %d, \n" , *ptr, num1, num2); // ptr이 가리키는 곳을 바꿔주기 않았기 때문에 포인터(*ptr)의 변화는 없다.
 
}
cs

 

  • 결과

 

 

 

728x90
반응형

댓글