[英]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)++ = 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.