运行程序测验一下:
*p++与*(p++)
#include<iostream>
using namespace std;
int main()
{//测试*p++int a[5] = {1,100,200,300};int *p=a; *p++= 10;cout << "*p: " << *p << endl;;cout<<"a[0]:"<<a[0]<<endl; cout <<"a[1]:" << a[1] << endl;cout<< endl;//测试*(p++)int b[5] = {1,100,200,300 };int *q = b;*(q++) = 10;cout << "*q: " << *q << endl;;cout << "b[0]:" << b[0] << endl;cout << "b[1]:" << b[1] << endl;system("pause");return 0;
}
总结:*p++和*(p++)没有区别,查阅资料得到正确的理解,应该理解为,由于后++优先级高于*,应该先p++,后取值,但因为是后++,所以先执行*p,然后等赋值完成以后,p再++。
*p++与(*p)++
#include<iostream>
using namespace std;
int main()
{//测试(*p)++int a[5] = {1,100,200,300};int *p=a; (*p)++;cout << "*p: " << *p << endl;;cout<<"a[0]:"<<a[0]<<endl; cout <<"a[1]:" << a[1] << endl;cout<< endl;//测试*p++int b[5] = {1,100,200,300 };int *q = b;*q++;cout << "*q: " << *q << endl;;cout << "b[0]:" << b[0] << endl;cout << "b[1]:" << b[1] << endl;system("pause");return 0;
}
总结:(*p)++,先取*p,再使*p这个值加1,p指针并没有移动
*p++, 按照上面的理解,最后结果应是先执行*p,但这里并没有输出句子什么的,所以取了之后无法看出来,然后又执行了指针p的移动。
(*p)++=2此式子是错误的,因为(*p)++其实是个右值,而*p++和*(p++)是左值。所以*p++=2和*(p++)才不会出错
参考这两个例题:
例1
#include<stdio.h>
int main()
{int*p = NULL;int a[]={1,2,3,4}p
=a;*(p++) + = 100;printf(%d%d%d%d%d\n”,*p,a[0],a[1],a[2],a[3]);return 0;
}
答案为:2 101 2 3 4
例2
函数作用:将整型数组p中n个数据增大
void increment_ints (int p [ ], int n)
{assert(p != NULL); /* 确保p不为空指针 */assert(n >= 0); /* 确保n不为负数 */while (n) /* 循环n次. */{(*p)++;//不能用*p++, /* 增大p*/p++, n--; /* p指向下一位,n减1 */}
}