双指针** src和运算符(*(* src)++ = reg_offset)

时间:2019-04-04 04:15:04

标签: 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 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

2 个答案:

答案 0 :(得分:3)

src是指向unsigned int的指针的指针,例如,它用于二维数组。由于operator precedence,例程执行以下操作:

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

因此,总而言之,您将* src作为指向unsigned int的指针,将第一个指向的数据分配给reg_offset,然后对该指针进行递增,然后分配下一个元素到reg_data,最后再次增加指针*src

答案 1 :(得分:2)

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

考虑此*(*src)++ = reg_offset;

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

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

2)因此(*src)给出了指向变量或内存空间的地址。

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)的内容并进行验证。