C语言学习笔记——指针

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
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值