2014-01-31 57 views
0

我對處理指針有什麼誤解?
我有CAN1_msg_t緩衝區與輸入/輸出指針
我想將pCAN1RxMsg指針設置爲eq。 c1rxbuf-> buf [0]在我的CAN1GetPtr()函數中。如何在函數中設置C指針指向數組

struct CAN1_msg_t { 
    uint8_t flags; 
    uint32_t id; 
    uint8_t data[8]; 
}; 

struct can1_buf_st 
{ 
    unsigned int in; // In Index 
    unsigned int out; // Out Index 
    struct CAN1_msg_t buf[100]; // Buffer 
}; 

int CAN1GetPtr(struct CAN1_msg_t *pcan) 
{ 
    struct can1_buf_st *p = &c1rxbuf; 

    pcan = &(p->buf[p->out++]); 

    return 1; 
} 

static struct can1_buf_st c1rxbuf = { 0, 0, };  

void main() 
{ 
    struct CAN1_msg_t *pCAN1RxMsg; 

    if(CAN1GetPtr(pCAN1RxMsg)) { 

     if((*pCAN1RxMsg).id == 0x100) { 
      (...) 
     } 
    } 
} 
+0

當你傳遞'T * pcan'時,你不能改變'pcan'本身的值,因爲它是按值傳遞的,但是你也可以改變它所指向的值,也就是'* pcan'的值。 – zoska

+0

閱讀[需要指針的指針](http://stackoverflow.com/questions/18306935/need-of-pointer-to-pointer/18307020#18307020) –

回答

1

變化:

int CAN1GetPtr(struct CAN1_msg_t *pcan) 
{ 
    struct can1_buf_st *p = &c1rxbuf; 

    pcan = &(p->buf[p->out++]); 

    return 1; 
} 

要:

int CAN1GetPtr(struct CAN1_msg_t **pcan) 
{ 
    if (c1rxbuf.out < sizeof(c1rxbuf.buf)/sizeof(*c1rxbuf.buf)) 
    { 
     *pcan = &c1rxbuf.buf[c1rxbuf.out++]; 
     return 1; 
    } 
    return 0; 
} 

而且在功能main,改變CAN1GetPtr(pCAN1RxMsg)CAN1GetPtr(&pCAN1RxMsg)

+0

是的 - 你想改變指針的值,所以您需要傳遞指針的地址,即新值必須存儲的位置 - 因此'** pcan'。 – Floris

1

您正將一個指針傳遞給函數struct。這意味着你將地址傳遞給函數struct,這樣做會將地址複製到堆棧段中,並將其作爲函數的輸入參數。

在該函數中,您將擁有可以更改的結構內容的地址,但地址本身就是您在函數main函數中擁有的地址的副本。

如果要更改地址本身,則需要將地址傳遞給指向指針的地址值,或者如指出的那樣,struct CAN1_msg_t **pcan。然後您可以訪問地址值,如果您願意,可以從此處再次訪問該地址並訪問該值本身。