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

간접 참조 연산자(\)는 포인터를 통해 값에 간접 액세스합니다.The indirection operator (****) accesses a value indirectly, through a pointer. 피연산자는 포인터 값이어야 합니다.The operand must be a pointer value. 연산 결과는 피연산자가 가리키는 주소에 있는 값입니다.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.

피연산자가 함수를 가리키는 경우 결과는 함수 지정자입니다.If the operand points to a function, the result is a function designator. 저장소 위치를 가리키는 경우 결과는 저장소 위치를 지정하는 l-value입니다.If it points to a storage location, the result is an l-value designating the storage location.

포인터 값이 잘못된 경우 결과가 정의되지 않습니다.If the pointer value is invalid, the result is undefined. 다음 목록은 포인터 값을 무효화하는 가장 일반적인 조건의 일부입니다.The following list includes some of the most common conditions that invalidate a pointer value.

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

  • 포인터가 참조 시 표시되지 않는 로컬 항목의 주소를 지정합니다.The pointer specifies the address of a local item that is not visible 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 address-of operator (&) gives the address of its operand. 주소 연산자의 피연산자는 함수 지정자 또는 l-value가 될 수 있습니다. 이때, l-value가 지정하는 개체는 비트 필드가 아니며 register 저장소 클래스 지정자로 선언되지 않습니다.The operand of the address-of operator can be either a function designator or an l-value that designates an object that is not a bit field and is not declared with the register storage-class specifier.

    주소 연산의 결과는 피연산자에 대한 포인터입니다.The result of the address operation is a pointer to the operand. 포인터가 표시하는 형식은 피연산자의 형식입니다.The type addressed by the pointer is the type of the operand.

    주소 연산자는 파일 범위 수준에서 선언된 기본, 구조체 또는 공용 구조체 형식의 변수 또는 첨자된 배열 참조에만 적용될 수 있습니다.The address-of operator can only be applied to variables with fundamental, structure, or union types that are declared at the file-scope level, or to subscripted array references. 이러한 식에서는 주소 연산자가 없는 상수 식을 주소 식에 추가하거나 뺄 수 있습니다.In these expressions, a constant expression that does not include the address-of operator can be added to or subtracted from the address expression.

예제Examples

다음은 이러한 선언이 사용된 예제입니다.The following examples use these declarations:

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

이 문은 주소 연산자를 사용합니다.This statement uses the address-of operator:

pa = &a[5];  

주소 연산자(&)는 a 배열의 여섯 번째 요소의 주소를 가져옵니다.The address-of operator (&) takes the address of the sixth element of the array a. 결과는 포인터 변수 pa에 저장됩니다.The result is stored in the pointer variable pa.

x = *pa;  

이 예제에서는 간접 참조 연산자(\)를 사용하여 pa에 저장된 주소의 int 값에 액세스합니다.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.

if( x == *&x )  
    printf( "True\n" );  

이 예는 단어 True를 출력하여 x의 주소에 간접 연산자를 적용한 결과가 x와 동일하다는 것을 나타냅니다.This example prints the word True, demonstrating that the result of applying the indirection operator to the address of x is the same as x.

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

int  *proundup  = roundup;  
int  *pround  = &roundup;  

함수 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: &