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:
原题内容:创建包含一个整型数组的类。能否通过使用指向成员的指针对这个数组进行索引?

解决方案 »

  1.   

    我觉得是下面这句调用的不对:
    cout<<(a.*pa)[0]<<endl; 实在不知道该怎么调用了~~~ 郁闷死了。
      

  2.   

    cout<<(a.pa)[0]<<endl; 就可以了
      

  3.   

    char IntArray::* pa=IntArray::arr; //指向数组成员的成员指针
      

  4.   

    cout<<(char)(a.*pa)<<endl;
    cout<<((char*)&(a.*pa))[1]<<endl; 
    cout<<(char)(a.*pa+2)<<endl;
      

  5.   

    感谢朋友们的帮助,谢谢!
    vcmute(横秋)大侠的是正解~性欲分接近200,果然厉害!
      

  6.   

    原来是这样的:
    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 不等价么?
      

  7.   

    可是我发现不转换类型也可以,只要&后再*就行了。 
    cout<<(*(&(a.*pa)))[1]<<endl;//2-2为何??
      

  8.   

    VC6.0 有异常
    VC2003 7.1.3091 正常,
    估计是编译器Bug.