你只要明白两点:
(1)
int *p;
p : 地址
*P : 数据
int p
p : 数据
&P : 地址
(2)
数组的内存分布
int a[7]={1,2,3,4,5,6,7};
int *p = a
地址 数据 获取
#20000 1 a[0] == *(p++)
#20001 2 a[1] == *(p++)
#20002 3 a[2] == *(p++)
#20003 4 a[3] == *(p++)
#20004 5 a[4] == *(p++)
#20005 6 a[5] == *(p++)
#20006 7 a[6] == *(p++)
-----------------------------------------------------------------------------------------------------------------------------------------
其实呢你理解一下指针,那这些问题就很容易了:
我先说明的下变量吧,你自己分析一下:
变量在程序中他的值是可以不断变化的。可用四个部分来说明一个变量(通常叫变量的四元素):
1. 属性 - 变量的类型
2. 关联 - 变量在内存中的地址
3. 关联值 - 与变量相关联的地址属存放的内容(即:值)
4. 变量名 - 程序通过名得到相它关联的地址从而得到变量的值的。
int a = 3;
如图:
a
_______________
2000 |____ 3 ________|
2001 |_______________|
说明:
1. 声明时就会有这样的说明: 系统为一个变量开辟了一片int空间(占两个字节根据机器而言)假如地址为2000和2001,并为这空间起了个名为a使其与该地址相关联,并初始化了一个值3即:(用a 时实际就是用指向2000内的数据 3).
2. 指针它也是变量,同样有变量的性质 , 只是存放的内容不是一具具本的数字,而是别的对像(变量的地址) 若 int *p = a; 则:
p
--------------
4000 |____2000_____| 而 2000地址又是与a与相联的所以 *p = 3; 而你在上面用: p = 5;
4001 |_____________|
也就是说:
p
-------------
4000 |____ 5 _____| 这样 就不知道他把那个地址给他的了,若你这样: *p = 1; 就会把数据
4001 |____________|
写入到不可想像的地址中去了,也就破坏别的人的数据。