地址与指针
和c语言一样地址符用&表示
#include<iostream>
int main(){
using namespace std;
int donts = 6;
double cups =4.5;
cout<<"donts的值为"<<donts;
cout<<"donts的地址为"<<&donts<<endl;
cout<<"cups的值为"<<cups;
cout<<"cups的地址为"<<∪︀
return 0;
//donts的值为6donts的地址为0x6ffe0c
//cups的值为4.5cups的地址为0x6ffe00
}
c++中的cout表示地址的时候经常使用十六进制表示法。在上面的例子中正常情况地址应该相差的是int的占用大小四个字节,但是在不同的系统中会有差异(我这个情况按群友大佬所说应该是由于debug的信息,在int前后各有两个四字节的标志)
下面用一个程序来理解指针
#include <iostream>
int main(){
using namespace std;
int updates = 6;
int * p_updates;
p_updates = &updates;
cout<<"值:updates="<<updates;
cout<<" , *p_updates="<<*p_updates<<endl;
cout<<"地址:&updates="<<&updates;
cout<<", p_updates = "<<p_updates<<endl;
*p_updates = *p_updates + 1;
cout<<"加一后的 updates = "<<updates<<endl;
return 0;
}
/*
值:updates=6 , *p_updates=6
地址:&updates=0x6ffe04, p_updates = 0x6ffe04
加一后的 updates = 7
*/
可以看出 星号*是用来获取当前指针所存放的值的所以如果赋值也可以这样做赋值 int *p_update这样子,也称p_updates是int型指针,*两边的空格是可选的。
而指针中存放的也是地址所以说p_updates和&updates的值是一样的
由于*运算符只针对于指针变量,所以后面只能跟指针
注意,在声明的时候,每一个指针变量前面都要加星号
比如int*p1,p2这样做声明的是p1指针和int p2.
指针和数组一样都是基于类型的,星号前面是什么名称,他就是什么类型的指针
int higgens = 5;
int * pr = &higgens;
在上面的语句中,其实是将pr的值设置为了 &higgens,而不是*pr
指针的危险
根据我通俗的理解是这样的,一般写代码就老老实实的先给变量赋值再给指针赋值,如果只给指针赋值不赋值变量,比如说
long * fellow;
*fellow = 223333;
那就说明代码只会给地址分配空间,而你输进去的这个值的变量没有初始化,那系统可能就随便给你塞到某个位置,万一塞到了代码区或者是什么乱七八糟的,那就危险了。
指针和数字不同
指针和整形不能混为一谈,如果一定要使用的化,加上括号进行强制类型转换把
int * pt;
pt = (int *)0xB8000000;