在代码中我通常会使用:
#include <stdlib.h>
void dref1(char **blah)
{
(*blah)[0] = 'a';
(*blah)[1] = 'z';
(*blah)[2] = 0x00;
}
/* or */
void dref2(char **blah)
{
char *p = *blah;
*p++ = 'w';
*p++ = 't';
*p = 0x00;
}
int main(void)
{
char *buf = malloc(3);
dref1(&buf);
puts(buf);
dref2(&buf);
puts(buf);
free(buf);
return 0;
}
我的问题是,是否有可能/如何取消引用并直接递增指针:
**blah = 'q'; /* OK as (*blah)[0] ? */
(*blah)++; /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
...
答案 0 :(得分:11)
我不知道你的真实意图是什么,但在我看来,你需要将*p++
和(*p)++
之间的差异理解为表达式。
第一个表达式取消引用指针并使指针本身前进,而不是指向的值。
第二个表达式取消引用指针并通过应用postfix ++
运算符修改指向的值。指向的值是指针还是简单的整数并不重要。
这与一元*
运算符和后缀++
运算符的优先级有关。如果没有括号,则首先应用++
运算符,并将其结果用作*
运算符的操作数。
编辑:
假设blah
的类型为char **
,这里列出了可能的操作以及每个操作的内容:
blah
会产生类型char **
; *blah
收益char *
; **blah
收益char
; *(*blah)++
取消引用blah
获取char *
,然后*p++
类比来。**blah++
取消引用blah
两次以获取指向的值,然后递增blah
指针。(**blah)++
取消引用blah
指针两次,然后(*p)++
类比来。答案 1 :(得分:2)
是的,我们可以。只是测试一下垃圾。我想你有这个主意。
使用blah
编写方式的问题是,当你回到main时,不仅缓冲区的内容发生了变化(正如你所想的那样),而是指针{{1}本身也是。这可能不是你想要的,也不是你需要释放的东西。
测试:
buf
答案 2 :(得分:0)
我认为dref1
没有错。
(*blah)[0] = *(*blah)+0 = **blah
所以你可以写(*blah)[0]='a';
执行(*blah)++;
没有意义。您只是递增并丢失malloc
返回的地址。