포인터 선언Pointer Declarations

"포인터 선언"은 포인터 변수의 이름을 지정하고 변수가 가리키는 개체의 형식을 지정합니다.A "pointer declaration" names a pointer variable and specifies the type of the object to which the variable points. 포인터로 선언된 변수는 메모리 주소를 갖습니다.A variable declared as a pointer holds a memory address.

구문Syntax

declarator:declarator:
  pointeropt direct-declarator  pointeropt direct-declarator

direct-declarator:direct-declarator:
  identifier  identifier

  ( declarator )  ( declarator )

  direct-declarator [ constant-expressionopt ]  direct-declarator [ constant-expressionopt ]

  direct-declarator ( parameter-type-list )  direct-declarator ( parameter-type-list )

  direct-declarator ( identifier-listopt )  direct-declarator ( identifier-listopt )

pointer:pointer:
  \* type-qualifier-listopt  \* type-qualifier-listopt

  \* type-qualifier-listopt pointer  \* type-qualifier-listopt pointer

type-qualifier-list:type-qualifier-list:
  type-qualifier  type-qualifier

  type-qualifier-list type-qualifier  type-qualifier-list type-qualifier

type-specifier는 개체의 형식을 제공합니다. 개체 형식은 기본, 구조체 또는 공용 구조체 형식일 수 있습니다.The type-specifier gives the type of the object, which can be any basic, structure, or union type. 포인터 변수는 함수, 배열 및 다른 포인터를 가리킬 수도 있습니다.Pointer variables can also point to functions, arrays, and other pointers. 더 복잡한 포인터 형식의 선언 및 해석에 대한 자세한 내용은 더 복잡한 선언자 해석을 참조하세요.(For information on declaring and interpreting more complex pointer types, refer to Interpreting More Complex Declarators.)

type-specifiervoid로 만들면 포인터가 참조할 형식 지정이 지연됩니다.By making the type-specifier void, you can delay specification of the type to which the pointer refers. 그러한 항목이 "void에 대한 포인터"로 참조되고 void *로 작성됩니다.Such an item is referred to as a "pointer to void" and is written as void *. void에 대한 포인터로 선언된 변수를 사용하여 모든 형식의 개체를 가리킬 수 있습니다.A variable declared as a pointer to void can be used to point to an object of any type. 그러나 포인터나 포인터가 가리키는 개체에 대해 작업을 수행하려면 대개 포인터가 가리키는 형식이 각 작업에 대해 명시적으로 지정되어야 합니다.However, to perform most operations on the pointer or on the object to which it points, the type to which it points must be explicitly specified for each operation. char \* 형식 및 void \* 형식의 변수는 형식 캐스팅 없이 대입과 호환됩니다. 형식 캐스팅을 사용하여 이러한 변환을 수행할 수 있습니다. 자세한 내용은 형식 캐스팅 변환을 참조하세요.(Variables of type char \* and type void \* are assignment-compatible without a type cast.) Such conversion can be accomplished with a type cast (see Type-Cast Conversions for more information).

type-qualifierconst 또는 volatile이거나 둘 다일 수 있습니다.The type-qualifier can be either const or volatile, or both. 이 형식 한정자는 각각 프로그램 자체에서 포인터를 수정할 수 없거나(const), 프로그램 제어를 벗어나 일부 프로세스에서 포인터를 올바르게 수정할 수 있도록(volatile) 지정합니다.These specify, respectively, that the pointer cannot be modified by the program itself (const), or that the pointer can legitimately be modified by some process beyond the control of the program (volatile). constvolatile에 대한 자세한 내용은 형식 한정자를 참조하세요.(See Type Qualifiers for more information on const and volatile.)

declarator는 변수 이름을 지정하며 형식 한정자를 포함할 수 있습니다.The declarator names the variable and can include a type modifier. 예를 들어, declarator가 배열을 나타낼 경우 포인터 형식이 배열에 대한 포인터로 수정됩니다.For example, if declarator represents an array, the type of the pointer is modified to be a pointer to an array.

구조체, 공용 구조체 또는 열거형 형식을 정의하기 전에 구조체, 공용 구조체 또는 열거형 형식에 대한 포인터를 선언할 수 있습니다.You can declare a pointer to a structure, union, or enumeration type before you define the structure, union, or enumeration type. 아래의 예제와 같이 구조체 또는 공용 구조체 태그를 사용하여 포인터를 선언합니다.You declare the pointer by using the structure or union tag as shown in the examples below. 컴파일러가 구조체나 공용 구조체의 크기를 몰라도 포인터 변수의 공간을 할당할 수 있으므로 이러한 선언이 허용됩니다.Such declarations are allowed because the compiler does not need to know the size of the structure or union to allocate space for the pointer variable.

예제Examples

다음 예제에서는 포인터 선언을 보여 줍니다.The following examples illustrate pointer declarations.

char *message; /* Declares a pointer variable named message */  

message 포인터는 형식이 char인 변수를 가리킵니다.The message pointer points to a variable with char type.

int *pointers[10];  /* Declares an array of pointers */  

pointers 배열에 10개의 요소가 있고 각 요소는 형식이 int인 변수의 포인터입니다.The pointers array has 10 elements; each element is a pointer to a variable with int type.

int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */  

pointer 변수는 요소가 10개인 배열을 가리킵니다.The pointer variable points to an array with 10 elements. 배열의 각 요소는 int 형식입니다.Each element in this array has int type.

int const *x;      /* Declares a pointer variable, x,  
                      to a constant value */   

x 포인터를 수정하여 다른 int 값을 가리킬 수 있지만 포인터가 가리키는 값은 수정할 수 없습니다.The pointer x can be modified to point to a different int value, but the value to which it points cannot be modified.

const int some_object = 5 ;  
int other_object = 37;  
int *const y = &fixed_object;  
int volatile *const z = &some_object;  
int *const volatile w = &some_object;  

이 선언의 y 변수는 int 값에 대한 상수 포인터로 선언됩니다.The variable y in these declarations is declared as a constant pointer to an int value. 포인터가 가리키는 값은 수정할 수 있지만 포인터 자체는 항상 같은 위치, 즉 fixed_object 주소를 가리켜야 합니다.The value it points to can be modified, but the pointer itself must always point to the same location: the address of fixed_object. 마찬가지로 z는 상수 포인터지만 프로그램으로 값을 수정할 수 없는 int를 가리키도록 선언되기도 합니다.Similarly, z is a constant pointer, but it is also declared to point to an int whose value cannot be modified by the program. 추가 지정자인 volatilez로 가리킨 const int 값을 프로그램으로 수정할 수 없더라도 프로그램과 동시에 실행 중인 프로세스에서 올바르게 수정할 수 있음을 나타냅니다.The additional specifier volatile indicates that although the value of the const int pointed to by z cannot be modified by the program, it could legitimately be modified by a process running concurrently with the program. w 선언은 가리킨 값을 프로그램이 변경할 수 없으며 프로그램이 포인터를 수정할 수 없도록 지정합니다.The declaration of w specifies that the program cannot change the value pointed to and that the program cannot modify the pointer.

struct list *next, *previous; /* Uses the tag for list */  

이 예제에서는 구조체 형식 list를 가리키는 두 개의 포인터 변수 nextprevious를 선언합니다.This example declares two pointer variables, next and previous, that point to the structure type list. list 형식 정의와 선언의 표시 유형이 같을 경우 이 선언이 list 구조체 형식의 정의 앞에 나타날 수 있습니다(다음 예제 참조).This declaration can appear before the definition of the list structure type (see the next example), as long as the list type definition has the same visibility as the declaration.

struct list   
{  
    char *token;  
    int count;  
    struct list *next;  
} line;  

line 변수에 이름이 list인 구조체 형식이 있습니다.The variable line has the structure type named list. list 구조체 형식에는 세 가지 멤버가 있습니다. 첫째 멤버는 char 값에 대한 포인터이고 둘째 멤버는 int 값이며 셋째 멤버는 다른 list 구조체에 대한 포인터입니다.The list structure type has three members: the first member is a pointer to a char value, the second is an int value, and the third is a pointer to another list structure.

struct id   
{  
    unsigned int id_no;  
    struct name *pname;  
} record;  

record 변수에는 id 구조체 형식이 있습니다. pname은 이름이 name인 다른 구조체 형식에 대한 포인터로 선언됩니다.The variable record has the structure type id. Note that pname is declared as a pointer to another structure type named name. name 형식이 정의되기 전에 이 선언이 나타날 수 있습니다.This declaration can appear before the name type is defined.

참고 항목See Also

선언자 및 변수 선언Declarators and Variable Declarations