我有一个关于指针/引用的问题,我找不到很多有关的信息,因此,有了此方法声明(C ++):
void RequestParser::parseRequest(const char * request)
当我想使用此方法时,可以这样称呼它:
requestParser.parseRequest(buffer);
因此,回到定义中,该参数需要一个指针(const char * request),为什么我可以这样通过没有引用的缓冲区:
requestParser.parseRequest(&buffer);
这应该是正确的方法,对吗?也许幕后正在发生一些魔术,像这样:
void RequestParser::parseRequest(const char request[])
我知道您不能将数组作为值(至少是char数组)传递,因此这仅是语法糖:
void RequestParser::parseRequest(const char * request)
我误会什么?
答案 0 :(得分:3)
当您将buffer
之类的数组传递给parseRequest
时,就会出现array-to-pointer decay,
从数组类型的左值和右值到指针类型的右值存在隐式转换:它构造了一个指向数组第一个元素的指针。每当数组出现在不需要数组但指针为以下内容的上下文中时,都会使用此转换:
因此,实际上您是将指针传递给数组的第一个元素,它的类型为char *
(并且可以转换为const char*
)。
另一方面,您不能传递&buffer
,它获取数组的地址并返回指向数组的指针(即char (*)[2048]
),它与参数不匹配输入const char*
。