본문 바로가기

프로그래밍/C언어

[C언어] 포인터(4) - 포인터의 형변환, 상수포인터

안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.



1.포인터(4)


1) 포인터의 형변환


포인터도 앞에 강의에서 말한 것 처럼 변수이기 때문에 형 변환이 가능 합니다. 변수와 같이 자동 형변환강제 형변환이 가능 합니다. 


예를 들면 다음과 같습니다.  


1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
 
int main(void) {
 
    int i;
    double *ptr = &i;
 
 
    return 0;
}
 
cs


int 형 변수의 주소값을 double형으로 자동 형변환이 됩니다. 변수에서 자동 형변환 되던 것과 같습니다.


강제 형변환도 마찬가지 입니다. 위의 예제를 바꾸어 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
 
int main(void) {
 
    int i;
    double *ptr =(double *&i;
 
 
    return 0;
}
 
cs


변수에서는 (double)로 강제 형변환을 하였습니다. 하지만 포인터에서는 다릅니다. ptr이 포인터 변수이기 때문에 (double *)을 해주어야 합니다. 


포인터 변수를 강제로 형변환 해줄 때는 *연산자를 붙여 주어야 한다는 것만 주의해 주시면 되겠습니다.


2) 상수 포인터


포인터가 가르키는 대상이 상수 일 경우 포인터의 타입에도 const가 포함 되어야 합니다. 이를 가리켜 상수 포인터라고 합니다. 


1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(void) {
 
    const int MAX = 999;
    const int *ptr = &MAX;
    
    return 0;
}
 
cs


여기서 포인터가 가르키는 대상이 상수 이므로 *ptr의 값을 바꿀수는 없습니다.


3) 포인터 상수


포인터를 상수로 선언 하는 것도 가능 합니다. 포인터의 이름 앞에 const만 붙이면 됩니다.


1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(void) {
 
    int i = 1;
 
    int * const ptr = &i;
    return 0;
}
 
cs


포인터가 상수이면 포인터에 저장된 주소를 변경할 수 없으므로 포인터가 다른 대상을 가르킬 수 없습니다.