繁体   English   中英

双指针** src和操作(*(* src)++ = reg_offset)

[英]Double pointer **src and operation (*(*src)++ = reg_offset)

我是C / C ++的新手,我真的很困惑一个执行复杂操作的函数。 我只是想知道它是如何工作的? 功能是什么意思?

void writetoXX(unsigned int **src, unsigned int reg_offset, unsigned int reg_data){
    *(*src)++ = reg_offset;
    *(*src)++ = reg_data;
}

任何的想法 ??

更新我的理解:

void writetoXX(unsigned int **src, unsigned int reg_offset, unsigned int reg_data) {
    *(*src)++ = reg_offset;
    *(*src)++ = reg_data;
}

int main() {
    int a[10] = { 0 };

    int *p = a;
    printf("Before !!\n");
    for(int i=0;i<10;i++)
    printf("%d ", a[i]);
    writetoXX(&p, 20, 30);
    printf("After !!! \n");
    for (int i = 0; i<10; i++)
        printf("%d ", a[i]);

    getchar();
    return 0;
}

运行该程序后,我看到函数writetoXX将值arr [0] [0]和arr [0] [1]更改为20和30.这意味着该函数用于将数据写入2个连续块。

输出如下:

Before !!
0 0 0 0 0 0 0 0 0 0
After !!
20 30 0 0 0 0 0 0 0 0

src是指向unsigned int的指针,例如,它用于二维数组。 由于运算符优先级 ,例程执行:

  • *src ,它是一个指向unsigned int的指针
  • (*src)++递增指针,使其指向下一个unsigned int 它是一个后增量 ,因此它返回增量前的值。
  • *(*src)++*src 增量++ 之前指向的unsigned int

总而言之,你把* src作为指向unsigned int的指针,你将第一个指向的数据分配给reg_offset ,然后你增加这样的指针,然后你将下一个元素分配给reg_data ,最后你再次递增指针*src

双指针是一个存储另一个指针变量的地址的变量。

考虑这个*(*src)++ = reg_offset;

在一个行:的值reg_offset存储在存储于当前地址src和地址src递增。

您可以按以下顺序考虑这种情况。 1)如你所知, src是一个存储另一个指针或存储空间地址的变量。

2)所以(*src) whill给出指向变量或内存空间的地址。

3)由于运算符优先级, (*src)++发生。 您可以在执行当前行后读取,增加存储在src地址值

4)现在*(*src)哪个是存储在(*src)地址的存储空间。 所以*(*src) = reg_offset; reg_offset的值复制到该地址。 为清楚起见,我已删除此行中的++

5)当第二行*(*src)++ = reg_data; 即将被执行, (*src)将指向下一个地址。 所以reg_data被写入下一个地址。

请注意, next address并不意味着current_address+1 它实际上意味着current_address+sizeof(data type) 如果编译器中unsigned int为4字节,则next_address = current_address+4

您可以(*src)之间打印(*src)的内容并进行验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM