下面是源程序(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!
看谁能解释原因!!!
#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!
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]毕竟是不同的,一个是这个指针数组的首地址,一个内容是所指的地址