2014-01-31 46 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。然后您可以访问地址值,如果您愿意,可以从此处再次访问该地址并访问该值本身。