반응형
간접 연산자(*)와 주소 연산자(&)
포인터 변수는 어떤 변수가 데이터가 저장된 주소를 가리키는 변수입니다.
간접 연산자(*)는 변수의 선언에서 사용될 때와 아닐 때의 작동 방식이 다른데
변수의 선언에서 간접 연산자는 해당 변수가 포인터 변수라는 것을 명시하는 표시이고
변수의 선언이 아닐 때의 간접 연산자는 주소를 해당 데이터로 변환해주는 기능을 합니다.
주소 연산자(&)는 어떤 변수가 저장된 주소를 반환하는 연산자입니다.
따라서 아래와 같이 간접 연산자와 주소 연산자는 같이 쓰는 것이 일반적입니다.
int number = 123;
int *number_ptr = &number;
// number_ptr은 정수형 포인터 변수임을 명시하고 number의 주소를 저장합니다.
// 따라서 number와 *number_ptr은 같은 값을 가지며 값 변경 시에도 같이 변경됩니다.
(따라서 (변수의 선언이 아닐 때)*와 &는 +와 -, ×와 ÷처럼 비슷한 대응 관계를 갖습니다.)
따라서 다음과 같은 코드가 성립합니다.
int number = 123;
int *number_ptr = &(*(&(*(&number))));
// &number는 주소로, *는 변수로, &는 주소로, *는 변수로, &는 주소로 변환시켜
// *number_ptr은 numberd의 주소가 저장됩니다.
포인터의 기본
포인터 변수뿐만 아니라 모든 변수는 *와 &을 이용하여 연산할 수 있습니다.
int n = 1;
int *pn = &n; // pn은 n의 주소를 저장합니다.
printf("n의 값 = %d\n", n);
printf("*pn의 값 = %d\n\n", *pn);
// n과 *pn은 1로 같은 값을 내놓습니다.
printf("pn의 값 = %p\n", pn); // %p는 주소 값을 출력하는 서식 지정자입니다.
printf("&n의 값 = %p\n\n", &n);
// pn과 &n은 실행마다 다른 주소를 가지지만 같은 주소를 내놓습니다.
printf("&pn의 값 = %p\n", &pn);
// &pn은 포인터 변수 ptr의 주소로 결국 값이 저장된 주소의 주소인 셈입니다.
또한 포인터 변수는 어떤 변수를 가리키는 변수이기 때문에 당연히 가리키는 변수의 값이 변경되면 포인터 변수를 * 연산을 통해 값을 받을 때 변경된 값을 반환합니다.
int n = 0;
int *pn = &n;
n += 1;
printf("n += 1 후\n")
printf("*pn의 값 = %d\n", *pn);
// *pn은 1을 출력합니다.
*pn += 1;
printf("*pn += 1 후\n")
printf("n의 값 = %d\n", n);
// n은 2를 출력합니다.
결국 어떤 변수 A에 대한 포인터 변수는 A에 대한 또 다른 명칭이라고도 볼 수 있습니다.
반응형