C 不使用功能的给定pgm的备用pgm #包括 无效下_字符串(字符*); int main() { 字符串[100]; printf(“输入字符串以将其转换为小写\n”); 获取(字符串); 下弦(弦); printf(“输入的字符串小写为\%s\“\n”,字符串); 返回0; } 无效下_字符串(字符*字符串) { while(*字符串) { 如果(*字符串>='A'&&*字符串

C 不使用功能的给定pgm的备用pgm #包括 无效下_字符串(字符*); int main() { 字符串[100]; printf(“输入字符串以将其转换为小写\n”); 获取(字符串); 下弦(弦); printf(“输入的字符串小写为\%s\“\n”,字符串); 返回0; } 无效下_字符串(字符*字符串) { while(*字符串) { 如果(*字符串>='A'&&*字符串,c,string,C,String,及 在C中等效。类型为char[]的参数调整为类型char* 当然,当string是*运算符的操作数时,如: void lower_string(char string[]); 然后不能将其更改为string[],因为*这里是间接运算符,而不是类型名称的一部分 及 在C中等效。类型为char[]的参数调整为类型char* 当然,当string是*运算符的操作数时,如: void lower_string(char string[]); 然后不能将其更改为string[],因为*这里是间接运算

在C中等效。类型为
char[]
的参数调整为类型
char*

当然,当
string
*
运算符的操作数时,如:

void lower_string(char string[]);
然后不能将其更改为
string[]
,因为
*
这里是间接运算符,而不是类型名称的一部分

在C中等效。类型为
char[]
的参数调整为类型
char*

当然,当
string
*
运算符的操作数时,如:

void lower_string(char string[]);

然后不能将其更改为
string[]
,因为
*
这里是间接运算符,而不是类型名称的一部分。

两者之间没有区别,因为当数组传递给函数时,它会衰减并调整为指针


我不会编写这样的代码,然后将其标记为
C++
,因为
string
是标准的库类名。

两者之间没有区别,因为当数组传递给函数时,它会衰减并调整为指针


我不会编写这样的代码,然后将其标记为
C++
,因为
string
是一个标准的库类名。

符号[]在某种程度上基本上等同于
*
。 您可以接受
char[]
并仍然将其视为带有
*
的指针,也可以接受
char*
作为参数,并将其作为常规数组访问-这完全相同。 当它是一个用
[]
定义的数组时,您总是会得到一个指向内存中该点的指针,但指针将是常量(不能遵从它,只能访问它所指向的位置)。
当您使用
char-str[100];
声明数组时,实际上是在声明一个名为
str
const-char*
并指向堆栈中的内存区域。

符号[]在某种程度上基本等同于
*
。 您可以接受
char[]
并仍然将其视为带有
*
的指针,也可以接受
char*
作为参数,并将其作为常规数组访问-这完全相同。 当它是一个用
[]
定义的数组时,您总是会得到一个指向内存中该点的指针,但指针将是常量(不能遵从它,只能访问它所指向的位置)。 当您使用
char-str[100];
声明数组时,实际上是在声明名为
str的
const-char*
并指向堆栈中的内存区域。

由于数组会立即衰减为指针,因此数组永远不会真正传递给函数。您可以假设函数接收数组作为参数,并通过将相应的参数声明为数组来说明:

while (*string)
从字面上解释,此声明没有任何用处,因此编译器会转过身,假装您编写了指针声明,因为函数实际上会收到:

void f(char a[])
{ ... }
如果函数“接收”数组,如果函数传统上用于对数组进行操作,或者如果参数在函数中被自然地视为数组,那么谈论函数没有什么特别错误。
这种将类似数组的声明符转换为指针的方法只适用于函数形式参数声明,而不适用于其他任何地方。

由于数组会立即衰减为指针,因此数组永远不会真正传递给函数。您可以假设函数接收数组作为参数,并通过将相应的参数声明为数组来说明:

while (*string)
从字面上解释,此声明没有任何用处,因此编译器会转过身,假装您编写了指针声明,因为函数实际上会收到:

void f(char a[])
{ ... }
如果函数“接收”数组,如果函数传统上用于对数组进行操作,或者如果参数在函数中被自然地视为数组,那么谈论函数没有什么特别错误。
这种将类似数组的声明符转换为指针的方法只适用于函数形式参数声明,而不适用于其他任何地方。


它们几乎是一样的。例如

void f(char *a)
{ ... }
是的缩写

sz[x];

然而,当你写
char*sz;
时,你得到的只是一个指针。如果你写
char sz[size];
,你也会得到一个数组。请看haccks的答案。

它们几乎是一样的。例如

void f(char *a)
{ ... }
是的缩写

sz[x];

然而,当你写
char*sz;
时,你得到的只是一个指针。如果你写
char sz[size];
,你也会得到一个数组。请看haccks的答案。

函数参数没有衰减或转换,C表示参数已调整。好的,我已经修复了它。但是衰减不是定义为“类型/大小损失”?函数参数没有衰减或转换,C表示参数已调整。好的,我已修复了它。但衰减不是定义为“类型/大小损失”?使用
void f(char a[]的危险)
是为后来的读者/维护者准备的,他们不会去探索语言的所有细节。他们会被欺骗,认为
a
是一个数组,并且很可能尝试在
大小的
中使用它。这是一个很好的小陷阱,很容易避免