4.1.4 指针赋值

    C++允许同类型的指针间的赋值,如图4.2所示,pN1和pN2是两个相同类型的指针,执行“pN2=pN1;”这样一个赋值操作后,pN1和pN2指向同样的地址,也就是说,两个指针指向同一个内存单元,对pN2的任何改动都会影响pN1的值,反之亦然。

    通常来说,不同类型的指针之间是不能进行相互赋值的,第2章已经介绍过。不同类型的变量占用的内存字节数和存放形式不同,不同类型的变量赋值时,C++编译器的类型转换机制实现内存单元的转化,对短字节量进行扩展,对长字节量实施截断。对指针类型而言,尽管可以用显式类型转换通过编译,但内存中的数据格式并不变化,这种不同类型的指针赋值实际上意义不大。

    4.1.4 指针赋值 - 图1

    图 4.2 同类型指针间的赋值

    代码4.3 不同类型的指针间的赋值PointerAssignment


    <—————————————-文件名:example403.cpp—————————————-> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 //声明了一short型指针,并用short变量num1的地址为其初始化 06 short num1=100,*pNum1=&num1; 07 longpNum2=(long)pNum1;//强制转换用pNum1为long型指针pNum2赋值 08 cout<<"pNum1的地址:"<<&pNum1<<endl; 09 cout<<"pNum2的地址:"<<&pNum2<<endl; 10 cout<<"pNum1的内容:"<<pNum1<<endl; 11 cout<<"pNum2的内容:"<<pNum2<<endl; 12 cout<<"pNum2指向的值为:"<<*pNum2<<endl; 13 return 0; 14 }

    输出结果如下所示。


    pNum1的地址:0012FF78 pNum2的地址:0012FF74 pNum1的内容:0012FF7C pNum2的内容:0012FF7C pNum2指向的值为:-859045788

    【代码解析】代码4.3的意义可以体现在图4.3中。short型变量num占两个内存字节,代码第7行,当把short型指针pNum1强行赋给long型指针pNum2时,通过pNum2间接访问的是以0012FF7C为基址的4个内存字节,其值和100已经大不相同了。

    说明

    变量具体存储在哪个内存单元中,取决于你使用的编译器,示例中num变量地址为0012FF74,在其他系统中,这个值可能完全不同。

    4.1.4 指针赋值 - 图2

    图 4.3 代码4.3直观示意图

    简单地把整数赋给指针也是不允许的,下列代码是错误的。


    int*pNum=0X0012FF7C;如果必须对某个内存地址进行访问,可以通过强制类型转换来完成,如下所示。 intpNum=(int)0x0012FF7C;