我不完全理解这一点,有人可以帮助我评估下面的表达吗?如果消息包含**
且长度仅为*
,则使用*()
我们取消引用*message
和length
了吗?任何帮助将非常感激。
bool func(char** message, size_t* length)
{
*(*message + *length) = '\0';
}
答案 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';
}