我刚刚开始学习指针,经过多次添加和删除*
之后,我将用于将输入的字符串转换为大写的代码最终起作用..
#include <stdio.h>
char* upper(char *word);
int main()
{
char word[100];
printf("Enter a string: ");
gets(word);
printf("\nThe uppercase equivalent is: %s\n",upper(word));
return 0;
}
char* upper(char *word)
{
int i;
for (i=0;i<strlen(word);i++) word[i]=(word[i]>96&&word[i]<123)?word[i]-32:word[i];
return word;
}
我的问题是,在调用我发送的word
函数时,这是一个指针本身,所以在char* upper(char *word)
为什么我需要使用*word
?它是指向指针的指针吗?另外,char*
是因为它返回指向字符/字符串的指针吗?请澄清一下这是如何运作的。
答案 0 :(得分:4)
那是因为你需要的类型只是“指向char的指针”,表示为char *
,星号(*)是参数类型规范的一部分。它不是“指向char的指针”,它将被写为char **
其他一些评论:
您似乎混淆了取消引用运算符 *
(用于访问指针指向的位置),星号作为类型指定中的指针符号;您没有在代码中的任何位置使用取消引用运算符;你只是使用星号作为类型规范的一部分!请参阅以下示例:要将变量声明为指向char的指针,您需要编写:
char * a;
要为a
所指向的空间(通过使用取消引用运算符)指定值,您需要写:
*a = 'c';
数组(char)不完全等于指针(对char)(另请参阅the question here)。但是,在大多数情况下,可以将数组(char)转换为(char)指针。
您的函数实际上更改了外部char数组(和传回指向它的指针);不仅输入内容的大写由printf打印,而且word
函数的变量main
也将被修改,以便它保持输入单词的大写字母。请注意,这样的副作用实际上就是你想要的。如果你不希望函数能够修改外部变量,你可以写char* upper(char const *word)
- 但是你也必须改变你的函数定义,这样它就不会直接修改{ {1}}变量,否则编译器会抱怨。
答案 1 :(得分:2)
char upper(char c)
将是一个接受角色并返回角色的函数。如果你想使用字符串,那么约定是字符串是由空字符终止的字符序列。您无法将完整的字符串传递给函数,因此您将指针传递给第一个字符,因此char *upper(char *s)
。指向指针的指针在*
中有两个char **pp
:
char *str = "my string";
char **ptr_to_ptr = &str;
char c = **ptr_ptr_ptr; // same as *str, same as str[0], 'm'
upper也可以实现为void upper(char *str)
,但是让upper返回传递的字符串更方便。当你printf
上层返回的字符串时,你在样本中使用了它。
正如评论一样,您可以优化您的上层功能。您每strlen
次致电i
。 C字符串始终以空值终止,因此您可以将i < strlen(word)
替换为word[i] != '\0'
(或word[i] != 0
)。如果您不与96和123进行比较并减去32,则代码最好是读取,但如果您检查并使用'a','z','A','Z'或您想到的任何字符进行计算。
答案 2 :(得分:0)
*单词即使是函数中的数组字指针和指针字实际指向同一个东西,同时传递参数jst一个“指针”的副本,即输入的单词被传递,无论如何操作完成是在指针字上完成的,所以最后我们必须返回一个指针,所以返回类型被指定为*。