2011-12-17 30 views
3

我刚开始学习的指针,并经过大量添加和删除*我的代码,用于将输入的字符串转换为大写最终工程..通过函数传递字符串(C编程)

#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

我很困惑你在问什么。你问为什么它是上层(字符*字)而不是上层(字符字)? – Corbin 2011-12-17 13:46:19

+0

函数upper请求一个指针作为参数,并提供一个指针(word)。就我所知,这是正确的。 – 2011-12-17 13:47:26

+0

为了避免混淆,请在代码中将'word'参数的名称更改为'upper'或局部变量'word'。 – Mat 2011-12-17 13:47:57

回答

4

这是因为您需要的类型仅仅是“指向char的指针”,表示为char *,星号(*)是参数类型规范的一部分。这不是一个“指向字符指针”,将被写为char **

一些补充说明:

  1. 看来你迷惑引用操作*(用于访问的地方指针指向的地方)以星号作为类型指定中的指针符号;你没有在代码中的任何地方使用解引用运算符;你只使用星号作为类型规范的一部分!看到这些例子:声明变量作为字符指针,你会写:

    char * a; 
    

    将值分配到a指向(通过使用引用操作)的空间中,你会写:

    *a = 'c'; 
    
  2. (的炭)的阵列是不完全等于一个指针(到字符)(另见the question here)。但是,在大多数情况下,可以将(char)数组转换为(char)指针。

  3. 你的函数实际上改变了外部字符数组(传回一个指向它的指针); printf不仅会打印输入的大写字母,而且main函数的变量word也将被修改,以便它保存输入单词的大写字母。好好照顾这样的副作用实际上是你想要的。如果您不希望该功能能够修改外部变量,则可以编写char* upper(char const *word) - 但之后您必须更改函数定义,以便它不直接修改word变量,否则编译器会抱怨。

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' 

上也可以实现为void upper(char *str),但它更方便的上部返回所传递的字符串。当你使用upper返回的字符串printf时,你在样本中使用了这个。

就像一个评论,你可以优化你的上层功能。您每i致电strlen。 C字符串始终为空终止,因此您可以用word[i] != '\0'(或word[i] != 0)替换i < strlen(word)。此外,如果您不比较96和123并减去32,但如果您检查并使用'a','z','A','Z'或您想要的任何字符进行计算,则代码更适合阅读。

0

即使指针bt是数组字中的一个指针,指针字实际上也指向同一个东西,而传递参数jst是“指针”的副本,即输入的字被传递并且无论什么操作都是在指针字上完成的,所以最后我们必须返回一个指针,所以返回类型被指定为*。

相关问题