下面是源程序(VC++ 6.0编译),大家可以先猜猜答案!!然后见怪现象!!!Please!Let's go!!!
看谁能解释原因!!!
 
#include <iostream.h>
 
void main()
{
 {
  int *p = NULL;
  int *array[] = {p};     // 把指针p放进去
  array[0] = new int(50); // 在数组里初始化
 
  cout<< "array       " << array      << endl;
  cout<< "&array[0]   " << &array[0]  << endl;
  cout<< "array[0]    " << array[0]   << endl;
  cout<< "&p          " << &p         << endl;
  cout<< "p           " << p          << endl;
  //cout<< "*p           " << *p         << endl; //会产生异常!!所以注释了!!
  cout<< "*(array[0]) " << *array[0]  << endl;
 
  cout<<endl;
  delete array[0];
 }
 //////////////////////////////////////////////////////////////////
 {
  int *p = new int(50); // 先初始化指针
  int *array[] = {p};   // 把指针p放进去
 
  cout<< "array        " << array      << endl;
  cout<< "&array[0]    " << &array[0]  << endl;
  cout<< "array[0]     " << array[0]   << endl;
  cout<< "&p           " << &p         << endl;
  cout<< "p            " << p          << endl;
  cout<< "*p           " << *p         << endl;
  cout<< "*(array[0])  " << *array[0]  << endl;
 
  cout<<endl;
  delete p;
 }
 //////////////////////////////////////////////////////////////////
 {
  int i = 50;         // 不用指针了
  int *array[] = {&i};
 
  cout<< "array        " << array       << endl;
  cout<< "&array[0]    " << &array[0]   << endl;
  cout<< "array[0]     " << array[0]    << endl;
  cout<< "&i           " << &i          << endl;
  cout<< "i            " << i           << endl;
  cout<< "*(array[0])  " << *array[0]   << endl;
 }
}
 
这里是输出:
array       0x0012FF78
&array[0]   0x0012FF78
array[0]    0x00341098 // 原本以为值会和p(即:0x00000000)一样
&p          0x0012FF7C
p           0x00000000 // 和array[0]不一样!!
*(array[0]) 50
 
array        0x0012FF70
&array[0]    0x0012FF70
array[0]     0x00341098 // 原本以为值会和p(即:0x00341098)一样
&p           0x0012FF74
p            0x00341098
*p           50
*(array[0])  50         // 既然array[0]不等于p(即:0x00341098),何来的50!!!!!!!!
 
array        0x0012FF68
&array[0]    0x0012FF68
array[0]     0x0012FF6C
&i           0x0012FF6C
i            50         // Okey!
*(array[0])  50         // Okey!

解决方案 »

  1.   

    (1)
    int *p = NULL;
    int *array[] = {p};     // 此时array[0]=NULL
    array[0] = new int(50); // 此时array[0]=新开辟的空间首地址
    //cout<< "*p           " << *p         << endl; //会产生异常!!产生异常的原因是不能调出来null指向的数据,这是非法的,看看汇编就知道了
    (2)
    int *p = new int(50); // 此时p=新开辟的空间首地址
    int *array[] = {p};   // array[0]=p(3)
    int i = 50;         //申请内存
    int *array[] = {&i};//令array[0]=i的地址
    &array[0]和array[0]毕竟是不同的,一个是这个指针数组的首地址,一个内容是所指的地址