指针声明

指针声明命名指针变量,并指定变量指向的对象的类型。 声明为指针的变量保存内存地址。

语法

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可以是或constvolatile/或两者。 这些关键字分别指定指针不能由程序本身(const)修改,或者指针可以合法地由某些进程修改(程序控制volatile之外)。 有关详细信息 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 */

此示例声明指向结构类型的list两个指针变量(nextprevious)。 只要类型定义与声明具有相同的可见性,list此声明就可以显示在结构类型定义(list请参阅下一个示例)之前。

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

该变量具有名为 <a0/a0> 的结构类型。 结构 list 类型有三个成员:第一个成员是指向值的指针,第二个成员是一 charint 值,第三个成员是指向另一个 list 结构的指针。

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

变量 record 具有结构类型 id声明为指向另一个名为 <a0/a0> 的结构类型的指针。 此声明可以在定义类型之前 name 显示。

另请参阅

声明符和变量声明