最近写操作系统实验时着实被指针的自增操作恶心到了,所以出一篇博客总结一下,长个教训。
首先来看一段代码吧,请读者先自行判断一下这个操作之后输出结果是什么。
int a[] = {3,7};
int *b = a;
std::cout<<*b++;
你觉得输出的结果是什么呢?7 or 4?
正确答案是:3
下面解释一下:
std::cout<<*b++; 等价于:
std::cout<<*(b++);
即先*b取出指针指向的元素并返回,之后再对指针自增
其实加了括号之后就明确许多了。
所以接下来就详细总结一下各种情况吧。
原理:
“ * ” 取值运算符 和 “ ++ ”自增运算符的优先级一致,都是从右向左结合。
总结如下:
来一波全排列
int a[] = {3,7};
int *b = a;
++*b 相当于 ++(*b) 因此cout<<++*b 结果将是4,b指向[0],数组变成{4,7}
*++b 相当于 *(++b) 因此cout<<*++b 结果将是7,b指向[1],数组不变
*b++ 相当于 *(b++) 因此cout<<*b++ 结果将是3,b指向[1],数组不变
(*b)++ 没什么好说的 cout<<(*b)++结果将是3,b指向[0],数组变成{4,7}