C++ 双指针**src和操作(*(*src)和#x2B;+;=reg#u偏移)

C++ 双指针**src和操作(*(*src)和#x2B;+;=reg#u偏移),c++,c,C++,C,我是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 i

我是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;
}

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

考虑这个
*(*src)++=reg\u偏移量

在一行中:
reg_offset
的值存储在
src
中存储的当前地址,并且
src
中的地址递增

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

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

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

4) 现在,
*(*src)
这是地址存储在
(*src)
中的内存空间。So
*(*src)=reg_偏移量
reg_offset
的值复制到该地址。为了清楚起见,我删除了这行中的
++

5) 当第二行
*(*src)++=reg\u数据时即将执行,
(*src)
将指向下一个地址。所以
reg_数据
被写入下一个地址

请注意,
next address
并不意味着
当前地址+1
。它实际上意味着
当前地址+sizeof(数据类型)
。如果编译器中的
unsigned int
为4字节,则
next\u address=current\u address+4


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

src
是指向
无符号整数的指针的指针,例如用于二维数组。由于以下原因,例程执行以下操作:

  • *src
    为例,它是指向
    无符号整数的指针
  • (*src)+
    递增指针,使其指向下一个
    无符号int
    。它是一个,因此返回增量之前的值
  • *(*src)+
    是增量
    +
    之前由
    *src
    指向的
    无符号整数

总之,取
*src
,它是指向
无符号int
的指针,将第一个指向的数据分配给
reg\u offset
,然后递增该指针,然后将下一个元素分配给
reg\u data
,最后,你再增加指针<代码> *SRC .< /P>,必须有一个更清晰的方式来编写这个代码,就像在C++中一样(问题是标记C++):只要引用“代码> *c/COD>作为参数,如在<代码> RealTexx(未签名int *和指针,…)<代码>中,然后写入<代码>(指针)++=reg_偏移量
Before !!
0 0 0 0 0 0 0 0 0 0
After !!
20 30 0 0 0 0 0 0 0 0