一、基本概念
存储单元一般应具有存储数据和读写数据的功能,以8位二进制作为一个存储单元,也就是一个字节。每个单元有一个地址,是一个整数编码,可以表示为二进制整数。程序中的变量和主存储器的存储单元相对应。变量的名字对应着存储单元的地址,变量内容对应着单元所存储的数据。存储地址一般用十六进制数表示,而每一个存储器地址中又存放着一组二进制(或十六进制)表示的数,通常称为该地址的内容。
变量有三个要素是:变量名、变量类型、变量值。
变量代表了一个存储单元,其中的值是可变的,故称为变量。
一说到指针的大小很多人都会想到int型,char型,double型,然后觉得不同类型的指针所占内存大小不同,其实这是一种误区. 指针其实就是一个形无符号整型,一个整数而已,它的大小取决于你的系统是16 32 还是64位的 16/8=2byte 32/8=4byte 64/8=8byte .
指针所指向的内存块所占内存大小.char占一个字节,int占2个字节,double占4个字节,long double占8个字节(这是默认的32位编译环境下,在64位下翻倍就是了),所以一个char指针所占内存为4个字节(32位下),所指向的内存区域占1个字节.同理其它类型也是一样的,
操作符:&、*
&:通过变量取地址。
*:通过地址取值。
三、具体分析
1、普通变量:
int n = 64;
cout << endl << "Adderse_&n:" << &n << endl << " " << "Data_n:" << n << endl << endl;
普通变量变量名即地址中的数据(变量值)。
存在一个地址:&n(表示唯一)。
简单理解:普通变量名=数据。
int *a = &n;
cout << endl << "Adderse_&a:" << &a << endl << " " << "Adderse_a:" << a << endl << " "
<< "Adderse_&(*a):" << &*a << endl << " " << "Adderse_*(&a):" << *&a << endl << "Data_a:" << *a << endl << endl;
一级指针变量:变量名a实际所指的内容为变量n的地址,即a=&n=&(*a)=*(&a);其中*a表示通过a中的内容(n的地址)取值即n。
存在两个地址:&a(唯一表示)和a(表示不唯一,如上)。
简单理解:指针变量名=地址-------->数据。
int **p;
p = &a;
cout << endl << "Adderse_&(*p):" << &(*p) << endl << " " << "Adderse_*p:" << *p << endl << " " << "Adderse_&p:" << &p << endl << " " << "Adderse_p:" << p << endl << " "<< "Adderse_&(**p):" << &(**p) << endl << " " << "Adderse_**(&p):" << **(&p) << endl << " " << "Data_**p:" << " " << **p << endl << endl;
二级指针变量:变量名p所指内容为一级指针的地址=&a=&(*p)=*(&p)=p,该地址(&(*p))中的内容是*p,其中*p中的内容为n的地址=&n=&(**p)=**(&p)=*p
(其中p=&a,a=&n)。
存在三个地址:&p(表示唯一)、p(表示不唯一)、*p(表示不唯一)。
简单理解:指针变量名=地址---------->地址------------>数据。
其中&(*)和*(&)相互抵消功能。
运行结果: