연산자 주소 및 간접 참조Indirection and Address-of Operators

단항 간접 참조 연산자(*)는 포인터를 통해 값에 간접적으로 액세스합니다.The unary indirection operator (*) accesses a value indirectly, through a pointer. 피연산자는 포인터 형식이어야 합니다.The operand must be a pointer type. 연산 결과는 피연산자가 가리키는 주소에 있는 값입니다.The result of the operation is the value addressed by the operand; that is, the value at the address to which its operand points. 결과의 형식은 피연산자가 표시하는 형식과 동일합니다.The type of the result is the type that the operand addresses.

간접 참조 연산자의 결과는 피연산자가 형식에 대한 포인터 형식인 경우 형식입니다.The result of the indirection operator is type if the operand is of type pointer to type. 피연산자가 함수를 가리키는 경우 결과는 함수 지정자입니다.If the operand points to a function, the result is a function designator. 개체를 가리키는 경우 결과는 개체를 지정하는 Ivalue입니다.If it points to an object, the result is an lvalue that designates the object.

포인터 값이 유효하지 않으면, 간접 참조 연산자의 결과는 정의되지 않습니다.If the pointer value is not valid, the result of the indirection operator is undefined. 다음은 포인터 값을 무효화하는 가장 일반적인 조건 중 일부입니다.These are some of the most common conditions that invalidate a pointer value:

  • 포인터가 null 포인터입니다.The pointer is a null pointer.

  • 포인터는 참조 시에 수명이 종료된 개체(예: 범위를 벗어나거나 할당이 취소된 개체)의 주소를 지정합니다.The pointer specifies the address of an object after the end of its lifetime (such as an object that's gone out of scope or that's been deallocated) at the time of the reference.

  • 포인터가 가리키는 개체의 형식에 대해 부적절하게 정렬된 주소를 지정합니다.The pointer specifies an address that is inappropriately aligned for the type of the object pointed to.

  • 포인터가 실행 중인 프로그램에서 사용되지 않는 주소를 지정합니다.The pointer specifies an address not used by the executing program.

단항 주소 연산자(&)는 해당 피연산자의 주소를 제공합니다.The unary address-of operator (&) gives the address of its operand. 피연산자는 레지스터__로 선언되지 않고 비트 필드가 아닌 개체를 지정하는 lvalue이거나, 단항 * 연산자 또는 배열 역참조([]) 연산자 또는 함수 지정자여야 합니다.The operand must be either an lvalue that designates an object that is not declared __register and is not a bit-field, or the result of a unary * operator or an array dereference ([]) operator, or a function designator. 형식의 결과는 형식의 피연산자에 대한 형식 형식에 대한 포인터입니다.The result is of type pointer to type for an operand of type type.

피연산자가 단항 * 연산자의 결과이면, 연산자가 평가되지 않고 결과는 둘 다 생략된 것과 같습니다.If the operand is the result of a unary * operator, neither operator is evaluated and the result is as if both were omitted. 결과는 lvalue가 아니며 연산자에 대한 제약 조건이 여전히 적용됩니다.The result is not an lvalue, and the constraints on the operators still apply. 피연산자가 [] 연산자의 결과인 경우, & 연산자도 [] 연산자에 의해 함축된 단항 & #42; 는 평가되지 않습니다.If the operand is the result of a [] operator, neither the & operator nor the unary * implied by the [] operator is evaluated. 결과는 & 연산자를 제거하고 [] 연산자를 + 연산자로 변경하는 것과 동일한 효과가 있습니다.The result has the same effect as removing the & operator and changing the [] operator to a + operator. 그렇지 않은 경우 결과는 피연산자가 지정한 개체 또는 함수에 대한 포인터입니다.Otherwise, the result is a pointer to the object or function designated by the operand.

예제Examples

다음 예에서는 이러한 일반적인 선언을 사용합니다.The following examples use these common declarations:

int *pa, x;
int a[20];
double d;

이 명령문은 주소 연산자(&)를 사용하여 a 배열의 여섯 번째 요소의 주소를 가져옵니다.This statement uses the address-of operator (&) to take the address of the sixth element of the array a. 결과는 포인터 변수 pa에 저장됩니다.The result is stored in the pointer variable pa:

pa = &a[5];

이 예제에서는 간접 참조 연산자(*)를 사용하여 int저장된 주소의 값pa에 액세스합니다.The indirection operator (*) is used in this example to access the int value at the address stored in pa. 값이 정수 변수 x에 할당됩니다.The value is assigned to the integer variable x:

x = *pa;

이 예는 간접 참조 연산자를 x의 주소에 적용한 결과가 x와 동일하다는 것을 나타냅니다.This example demonstrates that the result of applying the indirection operator to the address of x is the same as x:

assert( x == *&x );

이 예는 함수에 대한 포인터를 선언하는 동일한 방법을 보여줍니다.This example shows equivalent ways of declaring a pointer to a function:

int roundup( void );     /* Function declaration */

int  *proundup  = roundup;
int  *pround  = &roundup;
assert( pround == proundup );

함수 roundup이 선언되면 roundup에 대한 두 개의 포인터가 선언되고 초기화됩니다.Once the function roundup is declared, two pointers to roundup are declared and initialized. 첫 번째 포인터, proundup은 해당 함수의 이름만을 사용하여 초기화되지만 두 번째 포인터, pround는 초기화 시 주소 연산자를 사용합니다.The first pointer, proundup, is initialized using only the name of the function, while the second, pround, uses the address-of operator in the initialization. 초기화는 동일합니다.The initializations are equivalent.

참고 항목See also

간접 참조 연산자: *Indirection Operator: *
주소 연산자: &Address-of Operator: &