指针运算拾遗I

指针运算拾遗I

如有错误,欢迎指正。
如若转载,请声明原创:https://blog.csdn.net/qq_29567701/article/details/82721745

包含如下例子:
1、*p + *p++ + *++p;
2、++*p++;
3、char(*p)[2]; *(*(p + 1)); *(*p + 1);

2018.10.30 添加:更正了之前 关于指针运算的 一些表述不当的说法。
如:后置++运算符,之前错误说法:“在该行表达式结束后起作用,指针向后挪一位”
正确说法“在该表达式计算结束后起作用,指针向后挪一位”
因为可能自加1之后,在同一行就进行了输出。

eg:
	int a[] = { 10, 20, 30, 40, 50, 60, 70, 80 };
	int n = sizeof(a) / sizeof(a[0]);
	int*p = a + 4;
	cout << *p << endl;
	cout << 4 + ++*p++ << "\t" << *p << endl;// 55  60
	disp(a, n);
/*
输出结果如下:
50
55      60
10      20      30      40      51      60      70      80
*/
分析:
1、 4 + ++*p++;相当于 4 + (++*p++)
2、++*p++ 相当于 ++ ( *(p++) )
2.1、++ ( *(p++) )
int*p = a + 4;//p刚开始指向了a[4], 50
p++ // 在该表达式 4 + ++*p++ 计算结束后起作用,指针向后挪一位;当前p仍然指向a[4], 50
*(p++) //取 a[4]的值,50
++ ( *(p++) ) //对50进行自加1操作 ++50=51
++();相当于 ++(*px) 相当于 *px = (*px) +1;

故:最终 的 4 + ++*p++ = 4 + 51 = 55;

同一行中,再次调用了之间后置++过的指针p;
进行了取值运算操作 *p
此时,上一个表达式中的后置++,起作用了,p指向了数组a中的下一个位置的元素a[5],
故,*p,即是取a[5]中的元素值,60

一、*p + *p++ + *++p;
题目:

	int a[] = { 1, 2, 3, 4, 5 };
	int *p = a;
	int result = *p + *p++ + *++p;
	cout << result << endl;

结果:6
分析如下:
1、 C++运算符优先级:
优先级 Top2: -(负号运算符)、++(后置++、前置++)、--(后置--、前置--)、*(指针取值运算符)、&(取地址运算符) 一个级别,遇到后,从左向右运算
注意其中,++--,比 * 优先级高
优先级 Top3: /*(乘)、%
优先级 Top4: +-(减法运算符)
优先级 Top8: &(按位与)、|^
2、*p + *p++ + *++p;

(1) 先做优先级高的运算:  ++
++运算符中,后置++比前置++优先级更高,故,先计算后置++
int *p = a;//p指向a[0]
p++; 等到表达式*p + *p++ + *++p;全部计算完毕之后,p指向下一个位置a[1],当下,p还是指向a[0].
 再运算前置++
 ++p; 指针p指向a数组的下一个元素,a[1],
 此时,表达式相当于:优先级如下:1,2,3...优先级递减
	(*p) + (*(p++)) + (*(++p));
	          1.1        1.2  
	 2       2         2
	     3           3
	注意此时,*p + *p++ + *++p; 表达式中所有的 指针p 都指向了a[1]
(2) 再做Top2中的次优先级:*(指针取值运算符)
取指针p当前所指数组元素a[1]中的值,2
	*p =2
	*p++ =2
	*++p =2
故最终的结果为2+2+2=6;

二、++*p++;
题目:

	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	int *p = a + 4;
	int b = 4 + ++*p++;
	cout << b << endl;

结果:10
分析如下:

1、int *p = a + 4;
指针p指向了 a[4], 即5
2、4 + ++*p++; 相当于 4 + ( ++*p++ );
	分析 ++*p++;:
	++*p++; 相当于 ++(*(p++));
	
	前置++和后置++是同一个优先级,故从左向右运算
	*(取值算符)虽然也是 Top2的优先级,但是却比++运算符优先级低
(1)故先运算p++
p++为后置运算符,故在该表达式4 + ++*p++运算结束之前,p是一直指向a[5]的,在该表达式运算结束后,p会指向a数组当前位置的下一位a[6].
(2)再运算 *(p++)
取p指针当前指向数组a中的值, 即a[5]的值,5
(3)最后运算 ++(*(p++));
对取来的值进行 自加1操作, ++5 = 6;
相当于 ++*px; 即 ++(*px), 即 *px=(*px)+1;

	故此时 ++*p++; 结果为 6
	故 4 + ++*p++; 结果为 4+6=10;

三、char(*p)[2]; *(*(p + 1)); *(*p + 1);

	char a[2][2] = { { 'a', 'b' }, { 'c', 'd' } };
	char(*p)[2] = a;//p:指向有两个char型字符数组的指针

//仅仅输出下面这一行
//	cout << *p << endl;//abcd烫烫構we<?

//仅仅输出下面这一行
//	cout << *p + 1 << endl;//bcd烫烫諏?鳥

//仅仅输出下面这一行
//	cout << *(p + 1) << endl;//cd烫烫凜€棼=

//仅仅输出下面这一行
//	cout << *(*(p + 1)) << endl;//c

//仅仅输出下面这一行
//	cout << *(*p + 1) << endl;//b
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值