다음을 통해 공유


포인터 선언

포인터 선언은 포인터 변수의 이름을 지정하고 변수가 가리키는 개체의 형식을 지정합니다. 포인터로 선언된 변수는 메모리 주소를 보유합니다.

문법

declarator:
pointer 선택direct-declarator

direct-declarator:
identifier
( declarator )
direct-declarator [ constant-expression 선택]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-list 선택)

pointer:
* type-qualifier-list 선택
* type-qualifier-list 선택pointer

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

기본 type-specifier , 구조체 또는 공용 구조체 형식일 수 있는 개체의 형식을 제공합니다. 포인터 변수는 함수, 배열 및 기타 포인터를 가리킬 수도 있습니다. (더 복잡한 포인터 형식을 선언하고 해석하는 방법에 대한 자세한 내용은 더 복잡한 선언자 해석을 참조하세요.)

이렇게 하면 포인터가 type-specifiervoid참조하는 형식의 사양을 지연할 수 있습니다. 이러한 항목을 "포인터 void"라고 하며 로 작성 void *됩니다. 포인터 void 로 선언된 변수를 사용하여 모든 형식의 개체를 가리킬 수 있습니다. 그러나 포인터 또는 포인터가 가리키는 개체에서 대부분의 작업을 수행하려면 포인터가 가리키는 형식을 각 작업에 대해 명시적으로 지정해야 합니다. (형식 및 형식의 변수는 형식 char *void * 캐스트 없이 할당과 호환됩니다.) 이러한 변환은 형식 캐스트를 사용하여 수행할 수 있습니다. 자세한 내용은 Type-Cast 변환을 참조하세요.

type-qualifier 중 하나 const 또는 volatile둘 다일 수 있습니다. 이러한 키워드는 각각 프로그램 자체()에서 포인터를 수정할 수 없거나 프로그램(constvolatile)의 제어를 벗어난 일부 프로세스에서 포인터를 합법적으로 수정할 수 있도록 지정합니다. 자세한 내용은 constvolatile형식 한정자를 참조하세요.

declarator 변수의 이름을 지정하고 형식 한정자를 포함할 수 있습니다. 예를 들어 배열을 나타내는 경우 declarator 포인터의 형식은 배열에 대한 포인터로 수정됩니다.

구조체, 공용 구조체 또는 열거형 형식을 정의하기 전에 구조체, 공용 구조체 또는 열거형 형식에 대한 포인터를 선언할 수 있습니다. 예제와 같이 구조체 또는 공용 구조체 태그를 사용하여 포인터를 선언합니다. 컴파일러가 포인터 변수의 공간을 할당하기 위해 구조체 또는 공용 구조체의 크기를 알 필요가 없으므로 이러한 선언이 허용됩니다.

예시

다음 예제에서는 포인터 선언을 보여 줍니다.

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

포인터는 message 형식이 있는 변수를 가리킵니다 char .

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

배열에는 pointers 10개의 요소가 있으며 각 요소는 형식이 있는 변수 int 에 대한 포인터입니다.

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

변수는 pointer 요소가 10인 배열을 가리킵니다. 이 배열의 각 요소에는 형식이 있습니다 int .

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

포인터 x 가 다른 int 값을 가리키도록 수정할 수 있지만 포인터가 가리키는 값은 수정할 수 없습니다.

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 로 선언됩니다. 가리키는 값은 수정할 수 있지만 포인터 자체는 항상 동일한 위치(주소) fixed_object를 가리킵니다. 마찬가지로 상 z 수 포인터이지만 프로그램에서 값을 수정할 수 없는 값을 가리키 int 도록 선언됩니다. volatile 지정자는 가리키는 z 값은 const int 프로그램에서 수정할 수 없지만 프로그램과 동시에 실행되는 프로세스에 의해 합법적으로 수정될 수 있음을 나타냅니다. 선언 w 은 프로그램이 가리키는 값을 변경할 수 없고 프로그램에서 포인터를 수정할 수 없도록 지정합니다.

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

이 예제에서는 구조체 형식을 가리키는 두 개의 포인터 변수(nextprevious)를 선언합니다 list. 이 선언은 형식 정의가 선언과 동일한 표시 유형을 없으면 구조체 형식의 list 정의 앞에 나타날 수 있습니다(다음 예제 참조) list .

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

변수 line 에는 구조체 형식이 있습니다 list. 구조체 형식에는 list 세 개의 멤버가 있습니다. 첫 번째 멤버는 값에 char 대한 포인터이고, 두 번째 멤버는 int 값이고, 세 번째 멤버는 다른 list 구조체에 대한 포인터입니다.

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

변수 record 에는 구조체 형식이 있습니다 id. pname 는 이름이 다른 구조체 형식에 대한 포인터로 선언됩니다 name. 이 선언은 형식이 name 정의되기 전에 나타날 수 있습니다.

참고하십시오

선언자 및 변수 선언