凡内存皆有实体位置跟虚拟位置
先清楚内存位置存的类型
位置里面存的 是 "位置" 还是 "值"
前者就是叫做指标 当然如果存的是 "位置里的位置" 就是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 *);
: : 请问这三行是怎么处理?