Programming/C

포인터 *연산자 , & 참조연산자 이해

Chanho. 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의 주소 값을 대입한다 라고 생각하면 된다.


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