函数参数中的数组 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 *
。即表达式&str
、str
和&str[0]
的地址相同。
因此在函数中,地址的这个值(传递的字符数组的第一个元素的地址)被解释为具有 char *
.
类型
std::string stdstr(reinterpret_cast<char*>(s), 8);
你得到类型数组的第一个元素的地址char *
。
当然你也可以这样写
std::string stdstr( *s, 8);
我有一个简单的数组 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 *
。即表达式&str
、str
和&str[0]
的地址相同。
因此在函数中,地址的这个值(传递的字符数组的第一个元素的地址)被解释为具有 char *
.
std::string stdstr(reinterpret_cast<char*>(s), 8);
你得到类型数组的第一个元素的地址char *
。
当然你也可以这样写
std::string stdstr( *s, 8);