B.5.15 基本运算和指针

假设

x 是t类型的左值表达式;

pt 是“指向t的指针”类型的可修改左值表达式;

v 是一个表达式;

则表达式

&x 产生一个指向x的指针,其类型为“指向t的指针”;

pt=& x设置pt指向x,其类型为“指向t的指针”;

pt=0 为pt赋值空指针;

pt==0 测试pt是否为空;

*pt 引用pt指向的值,pt的类型为t;

*pt=v 将v的值存储到pt指向的位置中,pt的类型为t;

1.指向数组的指针

假设

a 是一个元素类型为t的数组;

pa1 是一个“指向t的指针”类型的可修改左值表达式,它指向a中的一个元素;

pa2 是一个“指向t的指针”类型的左值表达式,它指向a中的一个元素或指向a中结束的最后一个元素;

v 是一个表达式;

n 是一个整型表达式;

则表达式

a、&a、&a[0] 每个都产生一个指向第一个元素的指针;

&a[n] 产生一个指向a中元素成员n的指针,其类型为“指向t的指针”;

*pa1 引用pa1指向的a中的元素,其类型为t;

*pa1=v 将v的值存储到pa1指向的元素,其类型为t;

++pa1 不论a中包含的元素是哪种类型,都会设置pa1指向a的下一个元素,其类型为“指向t的指针”;

—pa1 不论a中包含的元素是哪种类型,都设置pa1指向a的前一个元素,其类型为“指向t的指针”;

*++pa1将pa1 加1,再引用pa1所指的a中的值,其类型为t;

*pa1++在pa1 加1之前引用pa1所指向的a的值,其类型为t;

pa1+n 产生一个指针,它指向数组a中pa1所指元素之后的第n个元素,其类型为“指向t的指针”;

pa1-n 产生一个指针,它指向数组中pa1所指元素之前的第n个元素,其类型为“指向t的元素”;

*(pa1+n)=v 将v的值存储到pa1+n所指的元素中,其类型为t;

pa1<pa2 测试是否pa1所指元素位于pa2所指元素之前(任何关系运算符都可以用来比较两个指针)。

pa2-pa1 产生包含在指针pa2和pa1之间的元素个数(假设pa2所指元素位于pa1所指元素之前),其类型为整型;

a+n 产生一个指向a的元素成员n的指针,其类型为“指向t的指针”,而且在各个方面都等价于&a[n];

*(a+n) 引用a的元素成员n,其类型为t,而且在各方面都等价于a[n]。

两个整数相减所产生的实际整数类型由ptrdiff_t指定,它定义在标准头文件<stddef.h>中。

2.结构指针

假设

x 是一个struct s类型的左值表达式;

ps 是一个“指向的指针”类型的可修改左值表达式;

m 是结构的一个成员的名称,且类型为t;

v 是一个表达式;

则表达式

&x 产生一个指向x的指针,其类型为“指向struct s的指针”;

ps=&x 设置ps使其指向x,其类型为“指向struct s的指针”;

ps->m 引用ps所指的结构的成员m,其类型为t;

(*ps). m 同样引用这个成员,且各方面都等价于表达式ps->m;

ps->m=v 将v的值存储到ps所指的结构的成员m中,其类型为t;