2017-10-04 58 views
-3

這是一個簡單的問題,這是什麼設置SrcPkt?關於一個具體的C變量

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


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

我對C和C++有一個很好的理解,但指針一直是我的弱點。 這行代碼似乎設置指針SrcPkt指向參考RxPacket [i] .packetdata [0]

我只是部分有信心與我相信是正確的答案,我只是想一些驗證。 編輯:

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)。沒有更多的代碼(類型的定義:什麼* eactly *是'PacketStruct'等......)我們只能猜測,而不是回答。並在船上畫指針是我最好的建議。請花點時間嘗試(並在'gdb'下一步一步地運行'step') –

+0

您有兩個數組的某種結構類型和一個指向另一個的指針,這些指針都在另一個源中定義。然後,您爲SrcPkt分配一個指針,該指針從投射RxPacket數組的第i個元素的某個成員的第一個元素的地址派生。至少我的理解。 – Gnqz

回答

1

這設置SrcPkt指向地址RxPacket的 [I] .packetdata [0]。 &運算符返回(指向)分組數據的地址,該分組數據被轉換爲與SrcPkt相同的類型並分配給指針變量SrcPkt

參考文獻在C語言中不存在。在C++中,它們通常作爲指針周圍的語法糖來實現,因此您可以使用它們指向的對象而無需手動解引用它們。在C中,你必須自己處理和取消引用指針。