728x90
반응형
상수형 포인터
포인터를 상수로 선언하는 것도 가능하다.
이 때 주의할 점이 있는데 const 선언의 위치에 따라 의미가 달라진다는 점이다.
const int * ptr = #
예를 들어 위 코드처럼 선언했을 경우
포인터변수를 사용하여 변수에 접근하는 것은 허용되나
포인터변수를 역참조하여 변수를 수정하는 것은 불가능하다는 의미이다.
따라서 아래 코드처럼 사용하는 것이 불가능하다.
int num = 10;
const int * ptr = #
*ptr = 20;
그러나 포인터변수가 가리키고 있는 num까지 상수화된 것은 아니기때문에
아래 코드처럼 num의 값을 직접적으로 변경하는 것은 가능하다.
int num = 10;
const int * ptr = #
num = 20;
const 선언이 자료형 뒤로 갔을 경우에는 그 의미가 달라진다.
int * const ptr = #
위 코드와 같이 선언했을 경우
포인터변수 ptr을 상수취급하여 ptr이 가르키는 주소를 변경할 수 없다는 의미이다.
따라서 다음과 같은 코드는 컴파일 에러가 발생한다.
int num1 = 10;
int num2 = 20;
int * const ptr = &num1;
ptr = &num2;
그러나 이 때는 역참조를 통한 간접적 접근으로 변수의 값을 변경하는 것은 가능하다.
따라서 아래 코드는 문법적으로 문제가 없다.
int num = 10;
int * const ptr = #
*ptr = 20;
두 가지 의미를 가진 const 선언을 한 번에 할 수도 있다.
const int * const ptr = #
위 선언의 경우에는 const 가 갖고있는 두 가지 의미 모두를 지니고 있다고 생각하면 된다.
포인터가 가르키는 주소를 변경하는 것과 가리키고 있는 변수의 값을 수정하는 것
두 가지 모두 제한된다고 생각하면 된다.
728x90
반응형
'C언어 > C언어 문법' 카테고리의 다른 글
[C언어] 스트림(Stream), EOF (0) | 2024.02.20 |
---|---|
[C언어] static 변수, register 변수 (0) | 2024.02.19 |
[C언어] scanf 호출 시 &연산자를 사용하는 이유 (0) | 2024.02.18 |
[C언어] 포인터 반환 함수 (0) | 2024.02.17 |
[C언어] Call By Reference (0) | 2024.02.16 |