C 如何增加取消引用的双指针?
在代码中,我通常会使用:C 如何增加取消引用的双指针?,c,pointers,dereference,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 m
#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;
}
我不知道你的真正意图是什么,但在我看来,你需要了解
*p++
和(*p++
作为表达式之间的区别
第一个表达式取消对指针的引用,并使指针本身前进,而不是使指针指向的值前进
第二个表达式取消对指针的引用,并通过应用后缀++
运算符修改指向的值。指向的值是指针还是简单的整数并不重要
这与一元*
运算符和后缀++
运算符的优先级有关。如果没有括号,则首先应用++
运算符,其结果用作*
运算符的操作数
编辑:
假设blah
属于char**
类型,下面列出了可能的操作以及每个操作将执行的操作:
- 显然,
产生一个类型为blah
的值李>char**
产生*blah
李>char*
产生**blah
李>char
取消引用*(*blah)+
以获得blah
,然后进行char*
类比*p++
取消引用**blah++
两次以获取指向的值,然后递增blah
指针blah
将(**blah)+
指针解引用两次,然后进行blah
类比(*p)+
是的,我们可以。试一下。我想你有这个想法 使用
blah
编写方式的问题在于,当您返回main时,不仅缓冲区的内容发生了更改(与您所做的一样正确),而且指针buf
本身也发生了更改。这可能不是你想要的,也肯定不是你需要释放的
测试:
#包括
无效dref1(字符**废话)
{
(*blah)[0]=“a”;
(*blah)[1]=“z”;
(*blah)[2]=0x00;
}
/*或*/
无效dref2(字符**废话)
{
char*p=*blah;
*p++='w';
*p++='t';
*p=0x00;
}
无效dref3(字符**废话)
{
*(*废话)+='w';
*(*废话)+='t';
*(*blah)=0x00;
}
无效dref4(字符**废话)
{
**布拉赫='q';/*可以(*布拉赫)[0]*/
(*废话)++;/*为什么不是这个*/
*((*blah)++)=“w”;/*;或*/
}
内部主(空)
{
char*buf=(char*)malloc(3);
char*buf1=buf;
dref1(和buf);
put(buf);
dref2(&buf);
put(buf);
dref3(和buf);
put(buf);
puts(buf1);
buf=buf1;
dref4和buf;
put(buf);
puts(buf1);
免费(buf1);
返回0;
}
我认为dref1
没有问题
(*blah)[0]=*(*blah)+0=**blah
所以你可以写(*blah)[0]='a'代码>
做(*blah)+没有意义
您只是在递增并丢失由malloc
返回的地址 对。谢谢我自己才意识到:)。这就是问题所在。一旦我意识到我在做什么,这是非常明显的。测试一下什么,伙计?注意**blah++
正在增加buf的地址,这是一个堆栈地址。在这种情况下,在下一个语句中为blah
赋值可能会使堆栈崩溃。
**blah = 'q'; /* OK as (*blah)[0] ? */
(*blah)++; /* Why not this? */
*((*blah)++) = 'w'; /* ;or. */
...
#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;
}