typedef  void  *Ptr;
typedef HMMDef *HLink;
typedef float  **SMatrix;
typedef SMatrix  Matrix
typedef struct {
   struct _HMMSet *owner;  
   short numStates;        
   StateElem *svec;        
   SVector dur;            
   SMatrix transP;         
   int tIdx;             
   int nUse;              
   Ptr hook;               /* general hook */
} HMMDef;typedef struct {     /* attached to transP */
   Matrix tran;      
   Vector occ;      
   int minDur;       
} TrAcc; HLink *al_qList;
 TrAcc *ta;
ta = (TrAcc *)GetHook(al_qList[q]->transP);
/* return hook of m */Ptr GetHook(Ptr m)
{
   Ptr *p;
   
   p = (Ptr *) m; p -=2; return *p;
}
请教问题
1、为什么这样居然能给 变量ta赋值呢,两个结构体根本扯不上关系啊?
2、“p -=2”是什么意思?
3、这里面涉及到哪些机制?我真的不懂,请高人指点:)要想对它有所掌握,需要看哪方面的知识呢?

解决方案 »

  1.   

    1、 结构体强制转换,成员的值按内存布局得到。是比较危险的做法,如果你不熟悉最好不要怎么用。可以考虑用memcpy2、 p -= 2 等价于 p = p - 2;3、 C/C++的基础知识。
      

  2.   

    1、
    typedef  void  *Ptr;所以ptr就是一个void *
    所以强制转过去没什么大问题,
      

  3.   

    补充一下,p不是一个void *,而是一个指针,指向一个void *
      

  4.   


    //ta = (TrAcc *)GetHook(al_qList[q]->transP);
    //这里传递给函数的实际上就是SMatrix结构类型的数据,在GetHook函数里的只是移动了指针,
    强制改变了指针的数据类型,而GetHook返回的是空指针类型,可以转换为任意类型的能给变量ta赋值是因为ta结构的第一个类型是Matrix, SMatrix=Matrix的,如果你把TrAcc结构的成员变量顺序修改了,就不能赋值.
      

  5.   

    感动,有这么多高人指点!
    “p -= 2” 这个我知道是移动指针的位置, 我的问题是为什么要移动呢?是不是移动“2”与
    “Matrix tran” 成员变量在结构体中的位置有关啊?
      

  6.   

    为什么要向前移2就不是很清楚了,你给的信息不足。
    你应该看看al_qList[q]和TrAcc的内存布局是怎么样的,设个断点跟进取看看。