1.简单指针 *p:
(1)用于数组
int *p 定义指针
该指针表示指向某个变量的地址;
当指针与自增符号结合时,简单举例如下:
int m[5]={1,3,5,7,9};p=m;
A.*p++; B.*++p; C.++*p; D.x=*p++; E.x=*++p; F.x=(*p)++; G.x=*(p++) ;
首先,看个简单的例子,int m=0,n; n=m++; n=++m; n=(m++);中第一个式子得到m=1,n=0第二个式子得到m=1,n=1.
其中m++和++m的区别在于是 先赋值还是先计算。易搞混的是第三个式子n=(m++)得到的结果仍然是m=1,n=0 此处须说明,虽然括号将m++扩起优先计算,但是在C中,m++的含义是在计算其他赋值等式子之后再单独进行++,可以理解为单独一句m=m+1,因此优先级考虑就与扩号无关了。
由此再看ABC:先来比较*与++的优先级:*做乘号,比++优先级低,但是与此处无关;*做取内容符号时,优先级同++p中的++,但是低于p++中的++。
在AB中,二者意思相同,均为将指针后移一个单位,A中容易混淆。须记住它不是 *p = *p + 1; 它却是 *p = *(p+1); 而且是后加加;由于++和*优先级相同,C选项中先计算*p,取到p指向的内容,再对内容做自增,与前二者不同,代码如下:
#include<stdio.h>
main()
{
int m[5]={1,3,5,7,9},*a,*b,*c;
a=m;
b=m;
c=m;
*a++;
*++b;
++*c;
printf("this is *a: %d \n",*a);
printf("this is *b: %d \n",*b);
printf("this is *c: %d \n",*c);
}
输出结果见下
对于DEFG,结合上面两个方面也就不难理解:
D先将p指针内容给x,随后指针自增,得到*p为3,x为1;
E中先指向下一位再赋值,x=*p=3;
F中x仍为指针原本指向的值x=1;此处先取到p的值,再对值自增,得到*p最后为2;同时m[0]的值同步变为2;
G中由上方分析可知,()的存在对式子和++的先后顺序无影响,结果同D。
(2)用于字符串
字符串中,指针在用法上与数组有很大区别:
a.指针指向字符串须与字符串同数据类型;
b.讲指针指向字符串后,指针即可代替该字符串进行使用,表示整串输出字符串内容,而不是地址,如用puts(指针名)直接输出整个字符串;
c.二者用取内容运算符*,均表示相应数组在对应位置的内容,字符串指针p的类型是string,*p则是char(具体应用在输出格式上),注意,字符串指针*p指单个char变量,判断是否结束,用*p==‘\0’;
d.一个易错点!:
如下写法会正常编译,但是在运行时出现卡死:
int main() {
char *s1