函数参数中的数组 typedef 指针分解

Array typedef pointer decomposition in function parameter

我有一个简单的数组 typedef

typedef char myString[8];

一个函数接受 myString,另一个接受 myString*。有趣的是,这两个函数具有完全相同的实现并产生完全相同的输出:

void foo(myString s){
    std::string stdstr(reinterpret_cast<char*>(s), 8);
    std::cout << stdstr << std::endl;
}

void bar(myString* s){
    std::string stdstr(reinterpret_cast<char*>(s), 8);
    std::cout << stdstr << std::endl;
}

foo 对我来说有意义,但我不明白 bar 中发生了什么。为什么将 myString* 转换为 char* 是有效的?底层类型不是char**吗?我的猜测是有一些语法糖在起作用,但我找不到任何关于这个特殊情况的参考。

请注意,如预期的那样,将函数更改为 void foo(char* s)void bar(char** s) 会产生不同的输出。

工作示例here

您为数组类型引入了别名 myString

typedef char myString[8];

所以这个函数声明

void bar(myString* s){

相当于声明

void bar( char ( *s )[8] ){

如果你声明了一个数组,例如

char str[8] = "1234567";

并且正在调用函数 bar 就像

bar( &str );

那么表达式&str的值就是数组str占用的内存范围的地址。即它是数组 str 的第一个元素的地址,尽管表达式的类型是 char( * )[8] 而不是 char *。即表达式&strstr&str[0]的地址相同。

因此在函数中,地址的这个值(传递的字符数组的第一个元素的地址)被解释为具有 char *.

类型
std::string stdstr(reinterpret_cast<char*>(s), 8);

你得到类型数组的第一个元素的地址char *

当然你也可以这样写

std::string stdstr( *s, 8);