(1)指针运算符* 与取地址运算符&的优先级相同,按自右向左的方向结合。
设有变量定义语句: int a, *p=&a;
则表达式:&*p 的求值顺序为先"*"后"&",即& (*p)=&a=p 。
而表达式:*&a 的求值顺序为先"&"后"*",即* (&a)=*p=a 。
(2)"++"、"――"、"*"、"&"的优先级相同,按自右向左方向结合。下面结合例子加以说明。设有变量定义语句:
int a[4]={100,200,300,400},b;
int * p=&a[0];
为了叙述方便,假设系统给数组a分配的首地址为1000,如图7.4所示。
① b=*p++;
按自右向左结合的原则,表达式 *p++ 求值序顺为先"++"后"*",即:*(p++)。由于"++"在p之后为后置++运算符,所以表达式的实际操作是先取*p值,后进行p++的自加操作。即赋值表达式 b=*p++; 等同于下面两条语句:
b=*p; // b=*p=a[0]=100
p++; //p=p+sizeof(int)= 1004
最后运算的结果为b=100,p=1004指向a[1]。
② b=*++p;
按自右向左结合的原则,表达式 *++p 求值顺序为先"++"后"*",即:*(++p)。由于++在p之前为前置++运算符,所以表达式的实际操作是进行++p的自加操作,后取*p值。即赋值表达式 b=*++p; 等同于下面两条语句:
++p; //p=p+sizeof(int)= 1008,指向a[2]
b=*p; // b=*p=a[2]=300
最后运算的结果为b=300,p=1008指向a[2]。
设有变量定义语句: int a, *p=&a;
则表达式:&*p 的求值顺序为先"*"后"&",即& (*p)=&a=p 。
而表达式:*&a 的求值顺序为先"&"后"*",即* (&a)=*p=a 。
(2)"++"、"――"、"*"、"&"的优先级相同,按自右向左方向结合。下面结合例子加以说明。设有变量定义语句:
int a[4]={100,200,300,400},b;
int * p=&a[0];
为了叙述方便,假设系统给数组a分配的首地址为1000,如图7.4所示。
① b=*p++;
按自右向左结合的原则,表达式 *p++ 求值序顺为先"++"后"*",即:*(p++)。由于"++"在p之后为后置++运算符,所以表达式的实际操作是先取*p值,后进行p++的自加操作。即赋值表达式 b=*p++; 等同于下面两条语句:
b=*p; // b=*p=a[0]=100
p++; //p=p+sizeof(int)= 1004
最后运算的结果为b=100,p=1004指向a[1]。
② b=*++p;
按自右向左结合的原则,表达式 *++p 求值顺序为先"++"后"*",即:*(++p)。由于++在p之前为前置++运算符,所以表达式的实际操作是进行++p的自加操作,后取*p值。即赋值表达式 b=*++p; 等同于下面两条语句:
++p; //p=p+sizeof(int)= 1008,指向a[2]
b=*p; // b=*p=a[2]=300
最后运算的结果为b=300,p=1008指向a[2]。
③ b=(*p)++;
由于括号内优先运算,所以表达式先取出*p(即a[2])的值并赋给b,然后将*p的值即a[2]内容加1。所以表达式等同于下面两条语句:
b=*p; //b=a[2]=300
a[2]++ ; // a[2]=300+1=301
④ b=*(p++);
由①可知,该表达式等同于*p++,运算结果为:
b=*p; //b=a[2]=301
p++; // p=p+sizeof(int)=1012,指向a[3]
⑤ b=++*p ;
该表达式先进行"*"运算,再进行"++"运算,即先取出*p的值,再将该值加1。因此表达式实际进行了如下运算:b=++(*p)=++a[3]=400+1=401; p仍指向a[3]不变。
将上述讨论中各语句汇总为例题如下:
由于括号内优先运算,所以表达式先取出*p(即a[2])的值并赋给b,然后将*p的值即a[2]内容加1。所以表达式等同于下面两条语句:
b=*p; //b=a[2]=300
a[2]++ ; // a[2]=300+1=301
④ b=*(p++);
由①可知,该表达式等同于*p++,运算结果为:
b=*p; //b=a[2]=301
p++; // p=p+sizeof(int)=1012,指向a[3]
⑤ b=++*p ;
该表达式先进行"*"运算,再进行"++"运算,即先取出*p的值,再将该值加1。因此表达式实际进行了如下运算:b=++(*p)=++a[3]=400+1=401; p仍指向a[3]不变。
将上述讨论中各语句汇总为例题如下:
【例】指针运算符"*"、"&"、"++"优先级与结合律示例。
# include <iostream.h>
main()
{ int a[4]={100,200,300,400},b;
int *p=&a[0];
cout<<'\t'<<"p="<<p<<endl;
b=*p++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=*++p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=(*p)++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=*(p++);
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=++*p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
}
运行结果为:
p=0x0065FDE8
b=100 p=0x0065FDEC
b=300 p=0x0065FDF0
b=300 p=0x0065FDF0
b=301 p=0x0065FDF4
b=401 p=0x0065FDF4
# include <iostream.h>
main()
{ int a[4]={100,200,300,400},b;
int *p=&a[0];
cout<<'\t'<<"p="<<p<<endl;
b=*p++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=*++p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=(*p)++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=*(p++);
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=++*p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
}
运行结果为:
p=0x0065FDE8
b=100 p=0x0065FDEC
b=300 p=0x0065FDF0
b=300 p=0x0065FDF0
b=301 p=0x0065FDF4
b=401 p=0x0065FDF4