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
반응형
'Study > C언어' 카테고리의 다른 글
C언어 - sacnf의 &(주소연산자) (0) | 2018.12.17 |
---|---|
C언어 - int로 선언한 변수에 입력한 값을 char로 출력 할 경우 오류가 나는 이유. (0) | 2018.12.17 |
C언어 - 배열과 스택, 버퍼 오버플로우 (0) | 2018.12.17 |
C언어 - scanf_s의 사용법과 예제 (0) | 2018.12.13 |
C언어 - 정수형의 크기 (0) | 2018.12.10 |
댓글