为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。
如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。例如,C++编译系统一般为整型变量分配4个字节,为单精度浮点型变量分配4个字节,为字符型变量分配1个字节。内存区的每一个字节有一个编号,这图中就是“地址”。
请务必弄清楚一个内存单元的地址与内存单元的内容这两个概念的区别。在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为直接存取方式,或直接访问方式。
还可以采用另一种称为间接存取(间接访问)的方式。可以在程序中定义这样一种特殊的变量,它是专门用来存放地址的。
图6.2是直接访问和间接访问的示意图。为了将数值3送到变量中,可以有两种方法:
直接将数3送到整型变量i所标识的单元中。见图6.2(a)。
将3送到指针变量i_pointer所指向的单元(这就是变量i所标识的单元)中。见图(b)。
所谓指向,就是通过地址来体现的。
由于通过地址能找到所需的变量单元,因此可以说,地址指向该变量单元。因此将地址形象化地称为“指针”,一个变量的地址称为该变量的指针。
int n = 10;
int *p = &n; //不管是C还是C++这句都是对的
int *p = n; //不管是C还是C++这句都是错的!!!类型不匹配
在不同的地方*表示的含意是有区别的。
当*出现在类型定义时(类型之后的地方),如int *p;那这是告诉编译器变量p的类型为int类型的指针(int*),所以你还可以这样写int* p;或int * p;都是可以的。
而直接出现在变量后(不是定义时),就表示解引用.
int *p;
p = &n;
是先定义p为一个int型的指针,然后让p等于(指向)整型n的地址
而int *p = &n; 变量p实际上是在定义的同时赋了初值,因此这里p前面的*是要和类型(也就是int)合起来看,表示p是一个int型的指针!此时,千万不要把*和p一起来看!
所以
int* p; //我有意把*写得和int靠拢一些:),强调int*是一种类型
p = &n;
和
int* p = &n;
是一回事
就好比:
int i;
i = n;
和
int i = n;
是一回事
而*p = *p + 6;中p前面的*就是解引用符了
不要把概念搞混了啊,呵呵!
你那个n是一种类型的对象,不是指针
而指针天生就是用来保存地址的,
所以int *p = n是不合法的
楼主只要记得把初始化和赋值分开就行了,没有那么复杂的。如果是在初始化,即int *p = ...中就应该跟一个int *。你不要把它认为是赋值,而是设定p的初值。
不过C++确实在这里很别扭。事实上引用型声明更别扭,但是好象除了用其它特殊字符也没有更好的办法。:)
为什么?
不知道....
两种形式而已.
一个是先定义指针再赋值,另一个是在定义指针的时候就初始化了.