#include <iostream> using namespace std; int main() { int * p; int a = 5; p = &a; cout<<"sizeof a is "<<sizeof(a)<<endl; cout<<"sizeof p is "<<sizeof(p)<<endl; cout<<"&a is "<<&a<<endl; cout<<"p is "<<p<<endl; cout<<"a is "<<a<<endl; cout<<"*p is "<<*p<<endl; cout<<"&p is "<<&p<<endl; *p = 6; cout<<"After opration *p = 6"<<endl; cout<<"a is "<<a<<endl; cout<<"*p is "<<*p<<endl; return 0; }
int * p; //定义了一个指针;
实际上也是定义了一个变量,这个变量的类型是指向int的指针。
这个变量在内存中获得到了一个4字节大小的空间;4字节正好可以表示内存的任意地址;
这个4字节大小的空间是被用来存储地址值的;//这是指针不同于普通变量之处,其值会被解释为地址;
所以指针变量的值,就是内存中某个空间的地址值;
打印&p 会显示一个地址值,例如 0x0028ff0c,这是4字节大小内存空间的首地址,也就是指针变量所在的地址,通常是系统自动分配的,且与p变量名绑定,一旦绑定不可修改;
打印 p 会显示p的值,p的值是4字节大小的值,是一个地址值。系统会把p的值解释为一个地址值。
接下来假设0x0028ff0c为首地址的4个字节内存空间中存储的值为0x0028ff08,即地址值为0x0028ff08。
换句话说指针p的值为0x0028ff08。
*p表示什么呢?
*p ->首先符号*可以理解成一个钥匙;这个钥匙用来读取某个内存上的值;格式为:*(地址)=*p=*(0x0028ff08),实际上表示的是0x00112233这个地址上内存空间的值;这个过程也叫解引用。地址可以理解为引用。或者叫解地址也好。
int *p = NULL; //定义一个指针变量时,同时给变量p赋了值;我们可以这么认为变量p,或者叫指针p,存储的值为0x00000000
*p = NULL; //表示的是在0x00000000为首地址的4个字节内存空间中,赋值为0x00 0x00 0x00 0x00;(特意分开);
所以这个符号*在定义和赋值时表示的含义不一样,定义时表示的是指针,赋值时表示的是解引用。
将数值存储到指定的内存地址:
*p = 0x100; //表示把0x0028ff08这个地址处内存空间值赋值为0x100;