赋地址时,不要求左值原来必须指向某个内存单元。
而赋数据则要求指针必须指向某个内存单元,给其赋值只是填充了该内存单元的内容。
char *tmp;
char kkk=99;
*tmp=1; //由于tmp没有具体地址,*tmp就没有指向具体内存,这样赋值导致程序崩溃。
*tmp=kkk; //由于tmp没有具体地址,*tmp就没有指向具体内存,这样赋值导致程序崩溃。
修改如下:
char *tmp=“init”; //初始化,指向具体地址
char kkk=99;
*tmp=1;
*tmp=kkk;
以下内容摘抄自网络
指针在定义后,仅仅是分配了一个32位的内存单元,而没有对指针进行初始化。如果没有初始化,那么指针的指向是随机的、未知的,这叫野指针。虽然,有些编译器也会自动将指针初始化为空,但是不要寄希望于这种不确定的编译器行为。如果直接引用野指针,不仅可能破坏程序,而且可能访问到程序之外。如果这个指针恰好指向了另外一个程序的数据,修改该数据将导致另一个程序发生异常。如果使用不当,甚至也会影响到操作系统的安全。这是非常严重的事情,因此,指针在使用前必须初始化。对于指针的初始化,有两种类型:
什么都不指;
内存地址。
其中,"什么都不指"指给指针赋予一个值,让它不指向任何地方,即空指针。这可以通过两种方法来实现,直接给指针赋予数值0和NULL。数值0是唯一可以不经过转换直接赋给指针的数值,除此之外的任何数值都不能直接赋给指针。NULL是宏,与0的效果是一样的。被赋予这两个值的指针都表示该指针为空,C++中倾向于使用0来表示空指针。
【示例7-7】 指针赋为空。
int *pInt1=0; //赋空值
int *pInt2=NULL; //赋空值
cout<<pInt1<<endl; //输出地址
cout<<pInt2<<endl; //输出地址
cout<<*pInt1<<endl; //输出内容
cout<<*pInt2<<endl; //输出内容
*pInt1=8; //赋值
分析:该示例定义了两个整型指针,两个指针都被初始化为空指针。第3、4语句是直接写指针的名称表示输出指针的地址。由于两个指针都是空,所以两个输出语句的输出都是0。第5、6两条语句是输出指针的内容。由于指针为空,所以其内容也就为空。空指针的地址为0,可以输出,但空指针的内容由于为空,不能被输出。所以第5、6两条语句可以被编译通过,但执行时会导致程序出错,甚至崩溃。最后一条语句是给指针赋值。由于pInt1被初始化为空,即它没有被分配用来存储数据的内存单元,所以对一个空指针赋值也是危险的,同样会导致程序错误。
注意:给指针初始化为空只能保证它不是某个随意乱指的野指针,不给其分配存储空间,直接使用空指针是不允许的。
除了将指针初始化为空,还可以将指针初始化为某个特定的地址,这种赋值的方法有多种。
指针无论什么时候都只是一个无符号整型数,所以指针的强制类型转换的目标实际上是指向内存单元。这种转换只是告诉系统要按指定的格式来解释某块内存单元的数据。例如将指向整型类型的指针强制转换为字符型,表示告诉系统将该指针指向的占4个字节的整型数据解释为字符型,并且只取sizeof(char)长度的字节作为字符指针的值。
除非程序员真的能够很好地控制不同种类型指针之间的强制转换的结果;否则不鼓励这么做。这么做也存在导致指针越界,指向非法区域的危险。
http://book.51cto.com/art/200909/154138.htm