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;