2011-12-17 32 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是「指針」的副本,即輸入的字被傳遞並且無論什麼操作都是在指針字上完成的,所以最後我們必須返回一個指針,所以返回類型被指定爲*。

相關問題