포인터 선언은 포인터 변수의 이름을 지정하고 변수가 가리키는 개체의 형식을 지정합니다. 포인터로 선언된 변수는 메모리 주소를 보유합니다.
문법
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 */
이 예제에서는 구조체 형식을 가리키는 두 개의 포인터 변수(next 및 previous)를 선언합니다 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 정의되기 전에 나타날 수 있습니다.