让我们研究一下(对于以下内容,请注意char const
并const char
在 C++ 中相同):
字符串文字和 char *
"hello"
是 6 个 const 字符的数组:char const[6]
. 与每个数组一样,它可以隐式转换为指向其第一个元素的指针:char const * s = "hello";
为了与 C 代码兼容,C++ 允许进行另一种转换,否则这种转换将是错误的:char * s = "hello";
它删除了 const!。这是一个例外,允许编译 C-ish 代码,但不推荐使用char *
指向字符串文字的点。那么我们有什么用char * s = "foo";
呢?
"foo"
-> array-to-pointer
-> char const*
-> qualification-conversion
-> char *
。字符串文字是只读的,不会在堆栈上分配。您可以自由地使指针指向它们,并从函数中返回该指针,而不会崩溃:)。
使用字符串字面量初始化数组
现在,什么是char s[] = "hello";
?这完全是另一回事。这将创建一个字符数组,并用 String 填充它"hello"
。文字没有被指出。相反,它被复制到字符数组中。并且数组是在堆栈上创建的。您不能从函数有效地返回指向它的指针。
数组参数类型。
如何让你的函数接受一个数组作为参数?您只需将参数声明为数组:
void accept_array(char foo[]);
但你忽略了大小。实际上,任何大小都可以,因为它只是被忽略:标准说以这种方式声明的参数将被转换为与
void accept_array(char * foo);
游览:多维数组
替换char
为任何类型,包括数组本身:
void accept_array(char foo[][10]);
接受一个二维数组,其最后一维的大小为 10。多维数组的第一个元素是其下一维的第一个子数组!现在,让我们对其进行改造。它将再次成为指向其第一个元素的指针。因此,实际上它会接受一个指向 10 个字符数组的指针:(删除[]
in 头,然后只创建一个指向您在头中看到的类型的指针):
void accept_array(char (*foo)[10]);
由于数组隐式转换为指向其第一个元素的指针,因此您只需在其中传递一个二维数组(其最后一维大小为 10),它就会起作用。事实上,任何n 维数组都是如此,包括 ; 的特殊情况n = 1
。
结论
void upperCaseString(char *_str) {};
和
void upperCaseString(char _str[]) {};
是一样的,因为第一个只是指向 char 的指针。但请注意,如果您想将字符串文字传递给它(假设它不会更改其参数),那么您应该将参数更改为,char const* _str
这样您就不会做不推荐使用的事情。