C/Basic

[C] 포인터 기초 - 간접 연산자(*)와 주소 연산자(&)

HYEOKJUN 2022. 6. 18. 22:00
반응형


간접 연산자(*)와 주소 연산자(&)

포인터 변수어떤 변수가 데이터가 저장된 주소를 가리키는 변수입니다.

 

간접 연산자(*)는 변수의 선언에서 사용될 때와 아닐 때의 작동 방식이 다른데

변수의 선언에서 간접 연산자는 해당 변수가 포인터 변수라는 것을 명시하는 표시이고

변수의 선언이 아닐 때 간접 연산자는 주소를 해당 데이터로 변환해주는 기능을 합니다.

 

주소 연산자(&)어떤 변수가 저장된 주소를 반환하는 연산자입니다.

따라서 아래와 같이 간접 연산자와 주소 연산자는 같이 쓰는 것이 일반적입니다.

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", &ptr);
// &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에 대한 또 다른 명칭이라고도 볼 수 있습니다.

반응형