我對這個程序感到困惑。關於char指針的問題
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", ptr);
ptr++;
printf("%c\n", ptr);
}
這是輸出。
ET ADSD
牛逼ADSD
我的問題是如何做的指針顯示字符的休息嗎?
我對這個程序感到困惑。關於char指針的問題
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", ptr);
ptr++;
printf("%c\n", ptr);
}
這是輸出。
ET ADSD
牛逼ADSD
我的問題是如何做的指針顯示字符的休息嗎?
您將參數的錯誤組合傳遞給printf
:%c
格式規範需要char
參數,而不是char*
。所以結果是不確定的 - 你的情況printf
似乎打印整個字符數組,但這只是純粹的機會。使用任一
printf("%c\n", *ptr);
或
printf("%s\n", ptr);
+1。如果你在嚴格設置下編譯,編譯器會警告你。例如'gcc -ansi -pedantic -W -Wall
如果您預期'E'爲第一輸出,'T'爲第二輸出。像
#include <stdio.h>
int main(void)
{
char* ptr="MET ADSD";
*ptr++;
printf("%c\n", *ptr);
ptr++;
printf("%c\n", *ptr);
}
所以你的意思是說%s把字符數組看作一個字符串? – Searock 2010-08-30 10:10:26
@Searock:它確實存在,但是你需要取消引用指針('* ptr')來獲取指向的字符。 – 2010-08-30 10:12:27
@Searock正好,但即使我不明白爲什麼它打印整個字符串%c,它應該打印字符。等於地址,即如果ptr = 1057,則(char)1057 – 2010-08-30 10:49:40
*運算符優先於++運算符。因此在你的例子中,兩條線
*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
+1 - 用於寫入警告。 – 2010-08-30 10:59:41
你實際上是試圖打印的字符%c
的指針值char*
。這是錯誤的。但是,我真的不明白爲什麼它會打印所有的字符。你確定你沒有使用%s
而不是%c
嗎?
在C 串是陣列字符,以及一個陣列僅僅是一個指針陣列的存儲器的第一單元。 所以定義,通過使用字符指針,
char* ptr="MET ADSD";
您聲明並初始化字符,一個字符串數組
,如果你認爲這兩個因素的下招說到:
++
上的指針增加其值,它指向的內存地址所以你縮放沿着兩個位置的陣列,和您打印使用%s
並傳遞指針,它
編輯我猜你會錯誤地將%c放入示例中
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的寬度),並將該字符打印到輸出中。不是一串字符。
如註釋所示,它看起來像* *不是您實際運行的C代碼,因爲您必須使用'%s'而不是'%c'。請注意確保您提交的示例與您運行的完全相同。 – 2010-08-30 10:14:24