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); // * 썼을 때 *p = 4; printf("%d\n", p); // * 안 썼을 때 printf("%d\n", *p); // * 썼을 때 } | cs |
실행결과
*p = 4;
보시다시피 *p 포인터 변수 주소 값에 있는 데이터에 4를 저장하라는 뜻이다
p = 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;
p = &a;
*p는 변수 a의 데이터 값(2) 을 가리킨다
*p = &b;
int b = 8;
위의 말을 그대로 변수 a의 값에 변수 b의 주소 값을 대입한다 라고 생각하면 된다.
이런 여러가지 궁금즘은 직접 찾아서 해보시길 바란다.