C에서 포인터 앰퍼샌드 표기법 사용
이 기사에서는 C에서 포인터 앰퍼샌드 표기법을 사용하는 방법에 대한 여러 방법을 소개합니다.
&var
표기법을 사용하여 주어진 변수의 주소 가져 오기
포인터는 단순히 메모리 주소를 보유하는 변수입니다. type * var
표기법으로 선언됩니다. 포인터는 동일한 유형의 주소를 할당 할 수 있으며 모든 포인터 유형은 일반 포인터라고하는void *
포인터를 저장할 수 있습니다. 객체의 주소를 저장하는 유형이 있으므로 이에 대한 액세스를 제공하는 연산자가 있어야합니다.
앰퍼샌드 기호&
는 종종address-of
연산자라고하는 단항 연산자로 사용됩니다. 데이터 개체 및 함수에서 개체가 저장된 주소를 검색하는 데 사용할 수 있습니다.
다음 예제와 같이 정수x
가 선언되고 초기화되었다고 가정합니다. 이 경우 앰퍼샌드 연산자&
로 주소를 가져와int *xptr
변수에 할당 할 수 있습니다. 결과적으로xptr
는 10233의 값을 가리키고*
연산자를 사용하여 후속 코드에서 해당 값에 액세스 할 수 있습니다.
여기서 별표*
는 두 가지 다른 컨텍스트에서 사용됩니다. 하나는 포인터 유형의 변수를 선언하는 것입니다. 다른 하나는 포인터에서 변수에 대한 값에 액세스하는 것입니다. 후자는 역 참조라고합니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
printf("x: %d\n", x);
printf("*xptr: %d\n", *xptr);
exit(EXIT_SUCCESS);
}
출력:
x: 10233
*xptr: 10233
포인터에서 변수 값에 액세스하려면*ptr
표기법 사용
역 참조 연산자를 사용하여 포인터에서 값을 검색하여 동일한 유형의 변수에 할당 할 수 있습니다. *
연산자는 정의되지 않은 동작을 초래하기 때문에null
또는 잘못된 포인터와 함께 사용할 수 없습니다. 대부분의 시나리오에서null
포인터를 시도하면 프로그램이 충돌 할 가능성이 있습니다. 그러나 유효하지 않은 포인터에 액세스하면 인식되지 않을 수 있습니다. 유효하지 않은 포인터는 메모리의 임의의 개체를 가리킬 수 있으며 이에 대한 작업은 계속 진행되지만 프로그램 상태의 정확성을 손상시킬 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10233;
int *xptr = &x; // xptr now points to x
int y = *xptr; // y now holds the value 10233
printf("x: %d\n", x);
printf("y: %d\n", y);
exit(EXIT_SUCCESS);
}
출력:
x: 10233
y: 10233
앰퍼샌드 표기법&
를 사용하여 객체 주소를 함수에 전달
주소 연산자를 사용하는 가장 일반적인 예는 객체에 대한 포인터를 함수 인수로 전달하는 것입니다. 다음 예제는 두 개의 정수 포인터를 인수로 취하는swap
함수를 보여줍니다. main
함수에서swap
이 호출되면 앰퍼샌드 연산자가x
및y
변수의 주소를 전달하는 데 사용됩니다. 하지만swap
함수 본문의*
연산자는 포인터 역 참조를 나타냅니다.
#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int x = 10233;
int y = 10133;
printf("x:%d, y:%d\n", x, y);
swap(&x, &y);
printf("x:%d, y:%d\n", x, y);
exit(EXIT_SUCCESS);
}
출력:
x:10233, y:10133
x:10133, y:10233
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook