凡記憶體皆有實體位置跟虛擬位置
先清楚記憶體位置存的類型
位置裡面存的 是 "位置" 還是 "值"
前者就是叫做指標 當然如果存的是 "位置裡的位置" 就是double pointer.
對我來說就是把他看成一種變數型態
有了指標可以將各處記憶體裡面的值拿出來玩
下面的code, 其實很容易看
在我腦海 就是這支func 宣告一塊塊的local區塊 (BT_HDR type)
1. 裡面存了傳進來的buffer 的位置
2. 當然buffer早就存在記憶體某個天涯海角之處 管他在哪...
3. 去遠端操控buffer 這塊記憶體 裡面存len /offset 該存甚麼 隨便..
4. 宣告 pp 去儲存 buffer +1 的位置 , aka buffer[1] ,
當然buffer +1 類型也是 BT_HDR 但兩邊同時轉成UINT8 *
5. pp 再度轉成void ** 只是為了存 一個型態為"void *"
call back function的位置..
※ 引述《blueguan ()》之銘言:
: 各位好~基本上這是Android原本的Code..
: 目前就是讀code在研究啦!!!因為很多地方沒有看懂...
: 有點類似讀一篇文章...但是讀下去..囧囧的
: 原始的Code如下:
: void btsnd_hcic_vendor_spec_cmd (void *buffer, UINT16 opcode, UINT8 len,
: UINT8 *p_data, void *p_cmd_cplt_cback)
: {
: BT_HDR *p = (BT_HDR *)buffer;
: UINT8 *pp = (UINT8 *)(p + 1);
: p->len = HCIC_PREAMBLE_SIZE + len;
: p->offset = sizeof(void *);
: *((void **)pp) = p_cmd_cplt_cback; /* Store command complete callback in
: buffer */
: pp += sizeof(void *); /* Skip over callback pointer */
: UINT16_TO_STREAM (pp, HCI_GRP_VENDOR_SPECIFIC | opcode);
: UINT8_TO_STREAM (pp, len);
: ARRAY_TO_STREAM (pp, p_data, len);
: btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
: }
: 網址如下唷:
: https://android.googlesource.com/platform/system/bt/+/android-6.0.0_r1/stack/hcic/hcicmds.c
: 感謝大家
: ※ 引述《blueguan ()》之銘言:
: : 在請問大家另外一個問題 如下:
: : UINT8 *pp = (UINT8 *)(p + 1);
: : *((void **)pp) = p_cmd_cplt_cback;
: : pp += sizeof(void *);
: : 請問這三行是怎麼處理?