ABOUT ME

chanho Yoon
chyoon0512@gmail.com


깃허브


블로그 이사!

이 블로그로 이사했어요!!


Today
-
Yesterday
-
Total
-
  • 포인터 *연산자 , & 참조연산자 이해
    Programming/C 2017. 7. 13. 14:57
    반응형

    포인터 * 연산자

     * 는 산술 연산자에서는 곱셈을 의미하지만 포인터에서는 포인터 변수 주소 값에 있는 데이터를 말한다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
        int *p;
        int a = 2;
     
        p = &a;
     
        printf("%d\n", p);   // * 안 썼을 때
        printf("%d\n"*p);   // * 썼을 때
    }
    cs

    실행결과



    보시다시피 * 를 사용하여 출력을 했을 경우 2값이 나오는 걸 확인할 수 있다.

    * 를 사용하지 않아서 나오는 첫 번째 결과 값은 메모리 주소 값이다.




    그렇다면 여기서 포인터 변수 p가 가리키는 변수a의 값은 어떻게 바꿔줄 수 있을지 생각해보자


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main() {
        int *p;
        int a = 2;
     
        p = &a;
     
        printf("%d\n", p);   // * 안 썼을 때
        printf("%d\n"*p);   // * 썼을 때
     
        *= 4;
     
        printf("%d\n", p);   // * 안 썼을 때
        printf("%d\n"*p);   // * 썼을 때
    }
    cs


    실행결과

    *= 4;

    보시다시피 *p 포인터 변수 주소 값에 있는 데이터에 4를 저장하라는 뜻이다


    = 4;

    만일 이렇게해서 4의 값을 넣는다면 포인터 변수p에 주소 값 4를 입력하는 것이다 이것은 곧 실행 중에 치명적인 오류가 생겨 비정상적인 프로그램 종료로 이어진다.



    참조연산자 & 

    &&는 논리 연산자에서 AND를 수행하지만 참조연산자 &(&변수명)는 뒤에 있는 변수의 주소 값을 불러온다고 생각하면 됩니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int main() {
        int *p;
        int a = 2;
        int b = 8;
     
        p = &a;
     
        printf("%p\n", p);   // * 안 썼을 때
        printf("%d\n"*p);   // * 썼을 때
     
        p = &b;
     
        printf("%p\n", p);   // * 안 썼을 때
        printf("%d\n"*p);   // * 썼을 때
     
    }
    cs
    @ : %p는 포인터 주소값을 출력하는 서식문자
    실행결과

    보시다시피 포인터 변수 p는 변수 a의 값을 가리키다가 p=&b; 다시 가리킴으로 인해서 값이 변수 b의 값 8로 출력이 되는 것을 확인 했습니다. 첫 번째 가리키는 주소 값과 두 번째에 가리키는 주소 값이 틀린 걸 확인할 수 있습니다.




    혹시나 하는 호기심에 *p=&b; 를 해보시는 것도 좋은 방법 입니다.

    실행결과

    포인터 변수 p가 가리키고 있는 주소 값도 변하지 않았을 뿐더러 엉뚱한 값이 출력이 되고있다.


    만약 *p=&b; 하게 된다면 

    *p는 포인터 주소 값에 있는 데이터를 가리키는 중이고

    &b는 변수 b의 주소 값을 불러오는 것인데


    int a = 2;

    = &a;

    *p는 변수 a의 데이터 값(2) 을 가리킨다


    *p = &b;

    int b = 8;

    위의 말을 그대로 변수 a의 값에 변수 b의 주소 값을 대입한다 라고 생각하면 된다.


    이런 여러가지 궁금즘은 직접 찾아서 해보시길 바란다.







    'Programming > C' 카테고리의 다른 글

    C언어 배열을 이용한 성적 입력, 정렬  (0) 2017.07.12

    댓글

Designed by Tistory.