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