2017-10-04 11 views
-3

これはSrcPktを何に設定するのかという簡単な質問です。特定のC変数について

extern PacketStruct RxPacket[NUM_PACKETS], TxPacket[NUM_PACKETS]; 
extern IPMBPacketRequestStruc *SrcPkt; 


SrcPkt = (IPMBPacketRequestStruc *)&(RxPacket[i].packetdata[0]); 

私はCとC++をよく理解していますが、ポインタは常に私の弱点です。このコード行はRxPacketの参照を指すようにポインタSrcPktを設定しているようだ [i]が.packetdata [0]

私は正しい答えであると考えているものに部分的にしか確信して、私はいくつかの検証をします。 EDIT:

typedef struct 
{ 
    unsigned char status; // Buffer status 
    unsigned char stat2; // re-send status 
    unsigned char channel; // Channel source/destination 
    unsigned char length; // Total # of bytes in packetdata 
    unsigned char index; // Current byte being processed in packetdata 
    unsigned char packetdata[IPMB_MAXDATALENGTH]; 
} PacketStruct; 

typedef struct 
{ 
    unsigned char rsSA; 
    unsigned char netFNrsLUN; 
    unsigned char cksm1; 
    unsigned char rqSA; 
    unsigned char rqSEQrqLUN; 
    unsigned char cmd; 
    unsigned char pktdta[37]; // rest of packet data 
} IPMBPacketRequestStruc; 
+0

すべての警告とデバッグ情報( 'gcc -Wall -Wextra -g')と**デバッガ** gdb'を使ってプログラムをステップバイステップで実行し、プログラムの状態を問い合わせることができますポインタ変数の)。あなたの理解を向上させます。紙の上に(ポインタのための矢印付きの)メモリの絵を描くのを頑張ってください。 –

+0

ところで、あなたの質問にはいくつかの[MCVE](http://stackoverflow.com/help/mcve)が欠けています。より多くのコード(型の定義:何が* PacklyStructなど)は、私たちは推測することができますが、答えはありません。そして、指針を描くことは本当に私の最高のアドバイスです。 –

+0

構造体型の2つの配列と、別のソースで定義されている別の構造体へのポインタを持っています。次に、RxPacket配列のi番目の要素のいくつかのメンバーの最初の要素のアドレスをキャストして、ポインタをSrcPktに割り当てます。少なくとも私の理解に。 – Gnqz

答えて

1

これは.packetdata [I] RxPacketのアドレスを指すようにSrcPktをセット[0]。 &演算子は、SrcPktと同じ型にキャストされ、SrcPktポインタ変数に割り当てられたパケットデータのアドレス(ポインタ)を返します。

参考文献は、C++には存在しません。C++では、通常、ポインタの周囲に構文的な砂糖として実装されているため、手動で間接参照しなくても使用することができます。 Cでは、ポインタを自分で処理し、逆参照する必要があります。

関連する問題