Run*_*ium 5 c pointers dereference
在代码中我通常会使用:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有可能/如何直接取消引用和增加指针:
**blah = 'q'; /* OK as (*blah)[0] ? */
(*blah)++; /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
...
Run Code Online (Sandbox Code Playgroud)
Bla*_*iev 12
我不知道你的真实意图是什么,但在我看来,你需要学习*p++和(*p)++表达之间的区别.
第一个表达式取消引用指针并使指针本身前进,而不是指向的值.
第二个表达式取消引用指针并通过应用后缀++运算符修改指向的值.指向的值是指针还是简单的整数并不重要.
这与一元运算*符和后缀运算符的优先级有关++.在没有括号的情况下,++首先应用运算符,并将其结果用作*运算符的操作数.
编辑:
假设它blah是类型char **,这里是一个可能的操作列表以及每个操作的内容:
blah产生一个类型的值char **;*blah产量char *;**blah产量char;*(*blah)++解引用blah获得char *,然后*p++比喻来.**blah++取消引用blah两次以获取指向的值,然后递增blah指针.(**blah)++取消引用blah指针两次,然后(*p)++类比来了.我们可以。只需测试一窝。我想你有这个想法。
使用您编写的方式的问题blah是,当您回到 main 时,不仅缓冲区的内容发生了更改(正确地按照您的意愿更改),而且指针buf本身也发生了更改。这可能不是您想要的,也绝对不是您需要释放的。
测试:
#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;
}
void dref3(char **blah)
{
*(*blah)++ = 'w';
*(*blah)++ = 't';
*(*blah) = 0x00;
}
void dref4(char **blah)
{
**blah = 'q'; /* OK as (*blah)[0] ? */
(*blah)++; /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
}
int main(void)
{
char *buf = (char*)malloc(3);
char *buf1=buf;
dref1(&buf);
puts(buf);
dref2(&buf);
puts(buf);
dref3(&buf);
puts(buf);
puts(buf1);
buf=buf1;
dref4(&buf);
puts(buf);
puts(buf1);
free(buf1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)