指针声明
“指针声明”可命名指针变量并指定该变量所指向的对象的类型。 声明为指针的变量保留了一个内存地址。
declarator
?
pointer
opt direct-declarator
direct-declarator
?
identifier
(
declarator
)
direct-declarator
[
constant-expression
opt ]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
opt )
pointer
?
*
type-qualifier-list
opt
*
opttype-qualifier-list
pointer
type-qualifier-list
?
type-qualifier
type-qualifier-list
type-qualifier
type-specifier
用于指定对象的类型,可以是任何基本、结构或联合类型。 指针变量也可以指向函数、数组和其他指针。 (有关声明和解释更复杂的指针类型的信息,请参阅解释更复杂的声明符。)
通过将 type-specifier
设为 void
,可以延迟指定指针所引用的类型。 这样的项被称为“指向 void
的指针”,并被写成 void *
。 声明为指向 void
的指针的变量可用于指向任意类型的对象。 但是,若要对指针或指针指向的对象执行大多数操作,则必须为每个操作显式指定指针指向的类型。 (类型为 char *
和 void *
的变量是赋值兼容的,不需要强制转换类型。)此类转换可使用类型强制转换完成。 有关详细信息,请参阅类型强制转换。
type-qualifier
可以是 const
和/或 volatile
。 这些关键词分别指定了指针不能被程序本身修改 (const
),或指针可以被超出程序的控制范围的某进程以合法方式修改 (volatile
)。 若要详细了解 const
和 volatile
,请参阅类型限定符。
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 */
本示例声明了指向结构类型 list
的两个指针变量(next
和 previous
)。 只要 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
类型之前出现。