2010-08-30 60 views
1

我對這個程序感到困惑。關於char指針的問題

#include <stdio.h> 

int main(void) 
{ 
    char* ptr="MET ADSD"; 

    *ptr++; 
    printf("%c\n", ptr); 

    ptr++; 
    printf("%c\n", ptr); 
} 

這是輸出。

ET ADSD
牛逼ADSD

我的問題是如何做的指針顯示字符的休息嗎?

+2

如註釋所示,它看起來像* *不是您實際運行的C代碼,因爲您必須使用'%s'而不是'%c'。請注意確保您提交的示例與您運行的完全相同。 – 2010-08-30 10:14:24

回答

4

您將參數的錯誤組合傳遞給printf%c格式規範需要char參數,而不是char*。所以結果是不確定的 - 你的情況printf似乎打印整個字符數組,但這只是純粹的機會。使用任一

printf("%c\n", *ptr); 

printf("%s\n", ptr); 
+3

+1。如果你在嚴格設置下編譯,編譯器會警告你。例如'gcc -ansi -pedantic -W -Wall -o ' – 2010-08-30 10:12:48

1

如果您預期'E'爲第一輸出,'T'爲第二輸出。像

#include <stdio.h> 

int main(void) 
{ 
    char* ptr="MET ADSD"; 

    *ptr++; 
    printf("%c\n", *ptr); 

    ptr++; 
    printf("%c\n", *ptr); 
} 
+0

所以你的意思是說%s把字符數組看作一個字符串? – Searock 2010-08-30 10:10:26

+0

@Searock:它確實存在,但是你需要取消引用指針('* ptr')來獲取指向的字符。 – 2010-08-30 10:12:27

+0

@Searock正好,但即使我不明白爲什麼它打印整個字符串%c,它應該打印字符。等於地址,即如果ptr = 1057,則(char)1057 – 2010-08-30 10:49:40

3

*運算符優先於++運算符。因此在你的例子中,兩條線

*ptr++; 
ptr++; 

具有相同的效果。

並且您在printf語句中使用了錯誤的類型。

變化

printf("%c\n", ptr); 

printf("%s\n", ptr); 

printf("%c\n", *ptr); 

取決於你想要什麼樣的輸出。

順便說一句,打開編譯器警告有助於在這種情況下。例如。海合會打印:

d.c: In function ‘main’: 
d.c:7: warning: value computed is not used 
d.c:8: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ 
d.c:11: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ 
d.c:12: warning: control reaches end of non-void function 
+0

+1 - 用於寫入警告。 – 2010-08-30 10:59:41

4

你實際上是試圖打印的字符%c的指針值char*。這是錯誤的。但是,我真的不明白爲什麼它會打印所有的字符。你確定你沒有使用%s而不是%c嗎?

2

在C 陣列字符,以及一個陣列僅僅是一個指針陣列的存儲器的第一單元。 所以定義,通過使用字符指針,

char* ptr="MET ADSD"; 

您聲明並初始化字符,一個字符串數組

,如果你認爲這兩個因素的下招說到:

  • 指針算術在使用運算符++上的指針增加其值,它指向的內存地址
  • 字符大小這幾乎是無處不在1個字節

所以你縮放沿着兩個位置的陣列,和您打印使用%s並傳遞指針,它

編輯我猜你會錯誤地將%c放入示例中

1

printf(...,ptr)正在傳遞指針,而不是它指向的字符。 程序的正確版本是:

#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    const char* ptr = "MET ADSD"; 
    ptr++; 
    printf("%c\n", *ptr); 
    ptr++; 
    printf("%c\n", *ptr); 
    return 0; 
} 

,它將打印

E 
T 

您所看到的輸出是沒有意義的,除非你正在使用%S。 - %c將把ptr的值轉換爲一個整數,將int截斷爲8位(char的寬度),並將該字符打印到輸出中。不是一串字符。