2011-04-20 58 views
1

有人可以告訴我爲什麼這個程序不起作用嗎?字符串和指針問題

int main() 
{ 
    char *num = 'h'; 
    printf("%c", num); 
    return 0; 
} 

我得到的錯誤是:

1>c:\users\\documents\visual studio 2010\projects\sssdsdsds\sssdsdsds\sssdsdsds.cpp(4): error C2440: 'initializing' : cannot convert from 'char' to 'char *'

但如果我寫這樣的代碼:

int main() 
{ 
    char num = 'h'; 
    printf("%c", num); 
    return 0; 
} 

它的工作。

+2

爲什麼你會期望*它的工作?你認爲'*'是什麼意思,你爲什麼認爲把它放在那裏並不重要? – 2011-04-20 15:22:37

回答

0

在第一種情況下,您將num聲明爲指向char的指針。在第二種情況下,您將其聲明爲char。在每種情況下,您都將一個char分配給變量。你不能指定一個字符指向一個字符,因此錯誤。

0

'H'=字符 「H」= NULL結尾的字符串

int main() 
{ 
    char *num = "h"; 
    printf("%s", num); // <= here change c to s if you want to print out string 
    return 0; 
} 

這將工作

5
char *num = 'h'; 

這裏,信'h'char,您正在嘗試將分配給一個char*。這兩種類型是不一樣的,所以你會遇到你在上面看到的問題。

這會工作:

char *num = "h"; 

不同的是,在這裏,你正在使用雙引號("),它創建了一個char*

這也將工作:

char letter = 'h'; 
char* ptrToLetter = &letter; 

你應該在C指針讀取多達準確瞭解這些不同的結構做。

2

char *是一個指向char的指針,與單個的char不同。

如果您有char *,那麼您必須用"進行初始化,而不是用'進行初始化。

並且還用於在printf()格式表示:

  • %s用於char *
  • %c僅用於char
0

正如有人剛纔說的,當你寫

char *num = 'h' 

編譯器,因爲你想給一個指針的值給你一個錯誤。你知道,指針只是只存儲你之前定義的另一個變量的內存地址的變量。但是,您可以訪問到一個變量的內存地址與運營商:

& 

和可變的指針應在同類型指向的元素來coerent。 例如,這裏是你應該如何正確定義一個PTR:

int value = 5; 

//defining a Ptr to value 

int *ptr_value = &value; 

//by now, ptr_value stores value's address 

無論如何,你應該學習的地方怎麼這一切工作以及如何師生比來實現,如果您有其他問題,請嘗試一個更具體的問題:)

0

當您使用char *h,您聲明一個指向一個char變量。這個指針保持它指向的變量的地址。

在簡單的話,你只需聲明一個字符變量char num='h',則變量num將持有的價值h所以如果你使用printf("%c",num)打印出來,你會得到輸出h

但是,如果你聲明一個變量的指針,爲char *num,那麼它實際上並不能持有任何字符值。我只能保存一些字符變量的地址。

例如看看下面的代碼

void main() 
{ 
    char a='h'; 
    char *b; 
    b=&a; 
    printf("%c",a); 
    printf("%c",b); 
    printf("%u",b); 
} 

在這裏,我們有一個char變量a和一個字符指針b。現在變量a可位於內存中,我們不知道的地方。 a保存值h&a表示address of a in memory語句b=&a將分配內存地址ab。由於b被聲明爲指針,它可以保存地址。

的statenment printf("%c",b)將打印出的垃圾值。

聲明printf("%u",b)將打印內存中的變量a的地址。

所以有char numchar *num之間的差異。你必須先閱讀指針。它們與正常變量不同,必須非常小心使用。