본문 바로가기

C&C++_Basic/C_Pointer

# C언어 포인터 : const 포인터 상수 기초 1( 포인터에 붙이기 VS 상수에 붙이기 )

#include<stdio.h>


int main()

{
// 기본원리 : const 바로 뒤에 붙은 애는 변경할 수 없다. 
//1,  " const type * 변수"  형태 ( type 앞에 const 가 붙을 때 ) 
    int i =10, j =20;

    const int *p = &i; 
    printf("%d\n",*p); // 10
    p = &j; 
    printf("%d\n",*p); // 20
/* 설명
*p를 상수로 고정한다는 것이다. 즉, *p는 무조건 고정된 값이고, 
설령 *p 혹은, p를 바꾸고 싶다고 하더라도 *p는 변경할 수 없다
즉, 만약 *p 혹은 p 를 변화시키고자 한다면 p 를 변화시켜야 한다 

예를 들어, 
*p = j ; 이렇게 하면 error 가 뜬다 
위의 코드를 보면, 
*p 가 처음에는 i 를 출력하고 있었다. 
그러나 *p 가 j 를 출력하게 끔 변화를 주고 싶었다.

제일 쉬운 방법은 *p = j 라고 하는 것이겠지만,
말했듯이, *p 는 고정된 값으로, 변화가 불가능
그러므로 p = &j; 와 같이
p 를 통해 포인터 p 가 가리키는 주소값을 i에서 j 로 바꿔주는 우회로를 택한 것이다.  
*/
 
// 2. " type * const 변수 "  형태 ( type 앞에 const 가 붙을 때 ) 
    double d =7.8, e = 2.7;
    double * const pd = &d;
    printf("%f\n", *pd ); // d 출력 
    *pd = e;
    printf("%f\n",*pd); // e 출력
/*
이번에는 pd를 고정시킨 것이다. 위에서는 *(포인터)를 같이 고정시켰지만,
이번에는 주소값만을 가리키는 pd 를 고정시킨 것.
그러므로 pd 가 가리키는 값 , 혹은 *pd 가 가리키는 값을 변화시키려면
*pd 를 통해 변환시켜야 하는 것이다. 
위의 코드에서는 e 를 d 로 변화시킨 것을 알 수 있다. 
*/


    return 0;

}