class IntArray {
public:
char arr[26]; //数组成员
int* p; //指针成员
IntArray() { //构造
for (char i=0;i<26;i++) {
arr[i]=i+'a';
}
p=new int;
*p=100;
}
IntArray(IntArray& ia) { //拷贝构造
p=new int;
*p=*(ia.p);
}
~IntArray() { //析构
delete p;
}
};
void t11_25() {
IntArray a;
int* IntArray::* pp=&IntArray::p; //指向指针成员的成员指针
char (IntArray::* pa)[26]=&IntArray::arr; //指向数组成员的成员指针
cout<<*(a.*pp)<<endl; //获得指针成员指向的值
//cout<<(a.*pa)[0]<<endl;
//数组成员访问错误,错误提示:“0x*******指令引用的0x******内存。该内存不能为"read"”。
}c++编程思想卷一,第11章习题11-25:
原题内容:创建包含一个整型数组的类。能否通过使用指向成员的指针对这个数组进行索引?
public:
char arr[26]; //数组成员
int* p; //指针成员
IntArray() { //构造
for (char i=0;i<26;i++) {
arr[i]=i+'a';
}
p=new int;
*p=100;
}
IntArray(IntArray& ia) { //拷贝构造
p=new int;
*p=*(ia.p);
}
~IntArray() { //析构
delete p;
}
};
void t11_25() {
IntArray a;
int* IntArray::* pp=&IntArray::p; //指向指针成员的成员指针
char (IntArray::* pa)[26]=&IntArray::arr; //指向数组成员的成员指针
cout<<*(a.*pp)<<endl; //获得指针成员指向的值
//cout<<(a.*pa)[0]<<endl;
//数组成员访问错误,错误提示:“0x*******指令引用的0x******内存。该内存不能为"read"”。
}c++编程思想卷一,第11章习题11-25:
原题内容:创建包含一个整型数组的类。能否通过使用指向成员的指针对这个数组进行索引?
cout<<(a.*pa)[0]<<endl; 实在不知道该怎么调用了~~~ 郁闷死了。
cout<<((char*)&(a.*pa))[1]<<endl;
cout<<(char)(a.*pa+2)<<endl;
vcmute(横秋)大侠的是正解~性欲分接近200,果然厉害!
int (IntArray::* pa)[26]=&IntArray::arr; //1-1
int (*ip)[26]=&(a.*pa);//1-2
cout<<(*ip)[1]<<endl;//2-1
//cout<<(a.*pa)[1]<<endl; //error~~
cout<<(*(&(a.*pa)))[1]<<endl;//2-2指向成员数组的成员指针,是一个数组指针,在这里是(int*)[26].
所以,可以使用一个数组指针指向它(1-2对应的代码)。然后进行访问(2-1对应的代码)。
但是,使用它的等价形式却不可以(error处的代码),运行时候提示内存非法访问。
而2-2处的代码,使用了取地址&,又取值*,的操作却可以成功执行了。~ 郁闷。纳闷了,(a.*pa)[1]和(*(&(a.*pa)))[1]不等价么? a 和 *&a 不等价么?
cout<<(*(&(a.*pa)))[1]<<endl;//2-2为何??
VC2003 7.1.3091 正常,
估计是编译器Bug.