#include <stdio.h>
void lower_string(char*);
int main()
{
char string[100];
printf("Enter a string to convert it into lower case\n");
gets(string);
lower_string(string);
printf("Entered string in lower case is \"%s\"\n", string);
return 0;
}
void lower_string(char *string)
{
while(*string)
{
if ( *string >= 'A' && *string <= 'Z' )
{
*string = *string + 32;
}
string++;
}
}
在此计划中,如果我将*string
替换为string[]
,该怎么办?
没有使用任何功能,任何人都可以帮助我编写上述程序吗?
请解释这是什么意思(* str)?
答案 0 :(得分:4)
void lower_string(char *string);
和
void lower_string(char string[]);
在C中是等效的。char []
类型的参数已调整到char *
类型。
当然string
是*
运算符的操作数,如下所示:
while (*string)
然后您无法将其更改为string[]
,因为*
这里是间接运算符而不是类型名称的一部分。
答案 1 :(得分:1)
两者之间没有区别,因为当一个数组传递给一个函数时,衰减会调整为一个指针。
我不会编写这样的代码,然后将其标记为C++
,因为string
是标准的库类名。
答案 2 :(得分:1)
<强> C-FAQ: Q-6.4 强>
由于数组会立即衰减为指针,因此数组实际上永远不会传递给函数。您可以假装函数接收数组作为参数,并通过将相应的参数声明为数组来说明它:
void f(char a[]) { ... }
从字面上解释,这个声明没有用,所以编译器转过来并假装你写了一个指针声明,因为这就是函数实际上会收到的内容:
void f(char *a) { ... }
谈论一个函数没有什么特别的错误,好像它“接收”一个数组,如果该函数传统上用于对数组进行操作,或者该函数在函数中被自然地视为一个数组。 /> 这种类似数组的声明符转换为指针只能在函数形式参数声明中保存,而不是其他地方。
答案 3 :(得分:0)
符号[]在某种程度上基本等同于*
。
您可以接受char[]
并仍然将其视为指向*
的指针,您可以接受char*
作为参数并使用[]
作为常规数组访问它 - 它&# 39;完全相同。
你总是得到一个指向内存中该点的指针,当它是一个用[]
定义的数组时,指针将是常量(不能对它进行处理,只能访问它的位置) #39; s指向)。
当您使用char str[100];
声明数组时,您实际上声明了const char*
名为str
并指向堆栈中的内存区域。
答案 4 :(得分:0)
他们几乎是一回事。例如,
sz[x];
是
的缩写*(sz + x);
然而,当你写char *sz;
时,所有的yau都是指针。温你写char sz[size];
,你也得到一个数组。见haccks的回答。