C如何评估这个表达式? C指针

时间:2016-11-12 00:13:13

标签: c pointers

我不完全理解这一点,有人可以帮助我评估下面的表达吗?如果消息包含**且长度仅为*,则使用*() 我们取消引用*messagelength了吗?任何帮助将非常感激。

    bool func(char** message, size_t* length)
    {
       *(*message + *length) = '\0';
    }

3 个答案:

答案 0 :(得分:2)

*(a + b)是撰写a[b]的另一种方式。上述陈述相当于

(*message)[*length] = '\0';

*message是一个char*字符串,*length是一个大小。它将索引*length处的字符设置为NUL。

额外的指针层没有特别的原因。从每个参数中删除一个*并使函数为:

更为正常
bool func(char* message, size_t length)
{
   *(message + length) = '\0';
}

或者,换句话说,

bool func(char* message, size_t length)
{
   message[length] = '\0';
}

答案 1 :(得分:0)

括号内的部分计算一个地址,然后NUL存储在该地址。

让我们打开它

char *ptr = *message; // derefernce the pointer to pointer
size_t len = *length; // get the length by derefencing the pointer
char * new_ptr = ptr + len;
*new_ptr = '\0';

答案 2 :(得分:0)

message是指向字节块的指针(实际上是一个字符串)。 length是指向size_t(某种非负整数)的指针。表达式解码如下:

*message是指向字符串

的指针

*length是一个数字,length指向的值,可能是字符串所需的长度,或者字符串将被截断的长度(从整个表达式行为来判断) )

*message + *length是aritmethic指针,指向某个位置的指针,该位置距离字符串的开头*length个字节

*(*message + *length)取消引用指针。这是我们指出的实际角色。

*(*message + *length) = '\0'这是在该位置存储NUL字节,从而终止字符串。

可以将此函数重写为此,以提高可读性:

bool func(char** message, size_t* length)
{
   size_t len = *length;
   char *msg = *message;

   msg[len] = '\0';
}