*++Ptr、++*Ptr、*Ptr++、和(*Ptr)++
刚刚接触C++或者C的新手们对这四种操作会比较迷糊,不能理解
虽然我也学过了一段时间,但是回头看的时候有时候也会犯错搞迷糊
今天把四种不同的指针操作都讲明白清楚
在这里可以提前去看一下前置++和后置++的区别,这两者的返回值是不同的
比如说**++Num**,这个就等于
Num = Num +1 ;
return Num;
如果是Num++,这个就等于
Num = Num +1;
Temp = Num;
return Temp;
大概的意思是这样子的哈,如果表述不清楚或者有逻辑上的错误,还请同学们指出。
1. *++Ptr
很明显可以看出来,这里明显是先对Ptr先进行地址的++操作,然后再取这块地址上的数据
但是这里并不是地址+1,在32位的情况下,移动一个字节,就是+4
如果是在64位的情况下,那么就是移动两个字节,就是+8
int main() {
int a[]{ 1001,2001,3001,4001 };
int* ptr = &a[0];
std::cout << ptr << std::endl;
std::cout << *++ptr << std::endl;
std::cout << ptr << std::endl;
return 0;
}
*++Ptr = *(++Ptr)
2. ++*Ptr
其实这个也非常好理解,就是先对Ptr进行解引用,然后对地址上保存的数进行++操作
int main() {
int a[]{ 1001,2001,3001,4001 };
int* ptr = &a[0];
std::cout << ptr << std::endl;
std::cout << ++ *ptr << std::endl;
std::cout << ptr << std::endl;
return 0;
}
可以看出来结果吧,没有骗你们
内存地址的结果没有改变,数据改变了
3. *Ptr++
在上面讲了前置++和后置++的区别,在这里会用得上哈
我个人感觉理解这四种不同的++,要先理解前++和后++的区别后再来看这个会比较好
在这里的话我们输出结果看一下哈
int main(){
std::cout << ptr << std::endl;
//std::cout <<*(ptr++) << std::endl;
std::cout << *ptr++ << std::endl;
std::cout << ptr << std::endl;
std::cout << *ptr << std::endl;
return 0;
}
各位可以看到吧
在这里ptr先++,他先和++运算符结合
但是呢,返回给*这个操作符的对象是temp也就是之前的ptr,所以第一次输出的结果是之前的地址单元中的数据1001
ptr已经改变了,所以再一次输出ptr的话,地址改变了,解引用的值也该改变了
我不知道自己说的清楚不清楚哈,大概就是这个意思了
然后可以把上面代码注释的那行取消一下,执行的结果也是这个样子的
没有骗你们吧
4.(*Ptr)++
这个就好理解了吧!理解了上面那个,这个应该问题也不大了
先对Ptr进行解引用,然后对数进行后++的操作
在这里我也写一段代码,大家看一下
其实我感觉只要理解了上面那个例子,这个应该不是什么大问题的
如果大家在写代码的时候会对操作符运算优先级有疑惑的话,我个人感觉多用()会提高代码的可读性,自己也好判断
看吧,地址是没有改变的,数值改变了
最后整个代码大家看一下,自己再整理整理!
自己再分析分析一下结果,如果可以分析出来呢,你明白了这四种操作的区别了!
int main() {
int a[]{ 1001,2001,3001,4001 };
int* ptr = &a[0];
std::cout << ptr << std::endl;
std::cout << *++ptr << std::endl;
std::cout << ptr << std::endl;
std::cout << std::endl;
std::cout << ptr << std::endl;
std::cout << ++ *ptr << std::endl;
std::cout << ptr << std::endl;
std::cout << std::endl;
std::cout << ptr << std::endl;
//std::cout <<*(ptr++) << std::endl;
std::cout << *ptr++ << std::endl;
std::cout << ptr << std::endl;
std::cout << *ptr << std::endl;
std::cout << std::endl;
std::cout << ptr << std::endl;
std::cout << (*ptr)++ << std::endl;
std::cout << ptr << std::endl;
std::cout << *ptr << std::endl;
return 0;
}
r << std::endl;
std::cout << std::endl;
std::cout << ptr << std::endl;
std::cout << (*ptr)++ << std::endl;
std::cout << ptr << std::endl;
std::cout << *ptr << std::endl;
return 0;
}
