포이터 변수 선언
자료형 * 변수명 = &참고하는 변수명; int* pInt = &i;
포인터의 개념은 엑셀과 비교해서 보면 이해하기 쉬워진다.

B3의 값을 35라고 할당해보자.
그리고 E4는 값을 할당하지 않고 B3라는 주소를 넣어보자

그러면 E4에는 35를 출력한다.
코드로 표현 하면 다음과 같다.
int main(){
int B3 = 35;
//포인터 변수에 B3 주소를 할당.
int* E4 = &B3;
printf("%d", *E4); //35
return 0;
}
B3의 값을 25로 바꾸면 어떻게 될까?

E4도 25로 바뀐다.
int main(){
int B3 = 35;
B3 = 25;
//포인터 변수에 B3 주소를 할당.
int* E4 = &B3;
printf("%d", *E4); //25
return 0;
}
포인터 변수의 값과 참조되는 변수의 주소값을 서로 비교해보면 이해하기 쉽다.
int a = 20;
int* pInta = &a;
cout << "참조되는 변수의 주소 값 : " << &a << endl;
cout << "포인터 변수의 값 : " << pInta << endl;
cout << "포인터 변수가 참조하는 주소의 값 : " << *pInta << endl;
cout << "참조되는 변수의 값 : "<< a << endl;
참조되는 변수의 주소 값 : 0000001C7A0FF7E4
포인터 변수의 값 : 0000001C7A0FF7E4
포인터 변수가 참조하는 주소의 값 : 20
참조되는 변수의 값 : 20
참조되는 값의 주소와 포인터 변수의 값은 동일하다는 것을 알 수 있다.
포인터 변수는 일반 변수의 주소값을 값으로 사용한다.
주의해야할 점은 포인터 변수의 주소값은 별도로 가지고 있다.
cout << "포인터 변수의 주소 값 :" << &pInta << endl;
포인터 변수의 주소 값 :000000931B2FFB08
즉, 포인터 변수는 메모리 내에서 별도로 공간이 할애되고 그 공간에 참조하는 변수의 주소값이 들어있는 형태이다.
기본적으로 포인터 변수는 참조하는 변수의 타입과 일치하지 않으면 문법오류를 발생시키지만 강제적으로 할당할 수 도 있다.
다음 코드를 참고해보자
int i = 100;
float f = 3.0f;
//float타입의 수를 int포인터에 강제로 할당.
int* pIntType = (int*)&f;
// i에 포인터 변수가 가르키고 있는 주소값의 값을 i에 할당
i = *pIntType;
cout << "int 타입의 포인터 변수에 float타입을 강제로 할당 시 값의 변화 : " << i << endl;
변수 i에는 100이라는 값이 할당되어 있고
실수타입의 주소를 강제적으로 포인터 변수에 할당하였다.
포인터 변수가 참조하는 주소의 값을 int형의 변수 i에 할당하면 어떤 값이 할당될까?
3.000000이 할당될까??
앞서 포인터 변수는 주소값을 넣을 때 해석하는 타입을 결정한다고 하였다.
포인터 변수는 가르키는 값을 int로 해석하다. 그러나 float타입을 강제로 할당되었기 때문에 float의 부동소수점의 이진수를 int형으로 해석하는 바람에 의도하지 않은 10진수 값을 가지고 오게 되었다.
결국 i에는 float타입의 부동소수 이진수 부분을 int형으로 해석하는 과정에서 다른 값을 출력하게 된 것이다.
따라서 특수한 상황에서 의도하지 않은 상황이라면 포인터 변수의 타입과 참조하는 변수의 타입을 일치시켜서 의도하지 않는 상황을 예방해야한다.