Site Overlay

C++ 指针快速掌握

>**指针名表示地址**
> **"\*"运算符: 称为间接值或解除引用运算符,**将其用于指针, 可以得到该地址存的值**
>比如\*p p是地址,\*p就是取p地址的值, 于是\*p相当于一个变量
>"&"运算符用来得地址, 比如&i就是得a的地址,同时还用来引用
示例:
```c++
#include<iostream>
using namespace std;
int main()
{
int i = 0;
cout << &i;
cin.get();
return 0;
}
```
在这个示例中,我只用了&运算符, 操作一个普通的变量, 看看结果:
>0x22fe4c
这就是一个地址
接下来有个问题, 能不能给它一个地址, 让它去看看是什么值(这样做非常危险)
示例:
```c++
#include<iostream>
using namespace std;
int main()
{
int i;
&i = 0x22fe4c;
cout << i;
cin.get();
return 0;
}
```
会发现, 根本编译不了
因为&的作用是**引用**和**取地址**
怎么区分?
和类型在一起的就是引用, 否则是取地址
示例:
```c++
#include<iostream>
using namespace std;
int main()
{
int i = 7;
int &j = i;//引用
i=8;
int *k = &j; //取地址
cout << j << "," << *k;
return 0;
}
```
既然k是地址, 为什么不能直接 int k = &j呢?
结果:
>[Error] invalid conversion from 'int*' to 'int' [-fpermissive]
编译不过, 因为无法从int*转到int
最后来个例子感受下
```c++
#include<iostream>
using namespace std;
int main()
{
int updates = 6;
int * p_updates;
p_updates = &updates;
int *p_updates2 = &updates;
cout << "updates=" << updates<<endl;
cout << "p_updates="<<p_updates<<endl;
cout << "*p_updates="<<*p_updates<<endl;
cout << "&p_updates="<<&p_updates<<endl;
cout << "p_updates2="<<&p_updates2<<endl;
cout << "*p_updates2="<<*p_updates2<<endl;
cin.get();
return 0;
}
```
Result:
```c++
updates=6
p_updates=0x22fe3c
*p_updates=6
&p_updates=0x22fe30
p_updates2=0x22fe28
*p_updates2=6
```
简要分析
```c++
p_updates = &updates;//这里的&表示取地址,于是 p_updates就变成了 updates的地址 0x22fe3c
int *p_updates2 = &updates;//这里的&表示引用, 于是 *p_updates2=6;
```

发表评论

电子邮件地址不会被公开。 必填项已用*标注