2012-10-21 95 views
1
#include<stdio.h> 
main() 
{ 

     char c = 'R'; 
     printf("%c\n",c); 
     c++; 
     printf("%c\n",c); 
     char *ptr ="Ramco Systems"; 
     printf("%c\n",(*ptr)); 
     (*ptr)++; 
     printf("%d\n",(*ptr)); 

} 

第一,第二,第三printf的輸出爲'R','S'&'R'(如預期的那樣)。然而行「(* ptr)++;」給運行時錯誤。有人能解釋爲什麼嗎?增加指針時的模糊行爲

+0

它看起來不像是在遞增指針。您取消引用指針並遞增值。 –

+0

我想你想要的是* ptr ++ :) – useratuniv

+1

我認爲目標是將'R'增加到下一個ansi字符,所以代碼中沒有錯字 - 只是指針指向的內存是不可修改的。 – jwaliszko

回答

6

原因是因爲內存指向ptr是在編譯時設置的,並且是不可修改的。

因此,通過*ptr訪問第一個字符並且返回R,但嘗試增加第一個字符會產生運行時錯誤,因爲您不允許修改您在編譯時提供的字符串。

要在下面賽格故障的評論,展開一個更好的方式來編寫代碼會一直:

const char *ptr ="Ramco Systems"; //pointer to const char 
(*ptr)++; // yields compiletime error because *ptr is a const char 

請注意,在這個新的代碼,聲明的指針類型更加準確,因此編譯器能夠在第二行發出編譯錯誤(比運行時錯誤好得多)。

+1

如果你啓用了足夠的警告,那麼你的編譯器也應該在ptr被定義和初始化的地方告訴你這個問題(因爲你將一個指針指向一個只讀區域指向一個可變指針) 。 –

+0

在c中的字符串文字不是常數..它只是不允許被chaged ..你在這裏混合c和C++ – Anirudha

+1

@ Fake.It.Til.U.Make.It這是正確的,但我建議的方式是仍然是更好的編寫代碼的方法,因爲它正確地表示了意圖,並且簡化了編譯時錯誤而不是運行時。 – Cam

0

的char * PTR =「的Ramco SYSTM」

上面的語句變成指針常數,你試圖改變它的內容是無效的,但如果你想編譯器扔掉,而編譯時錯誤你可以使用/寫入如下: const char * ptr =「Ramco System」

上述語句的行爲方式相同。唯一的區別是,當你編寫 (* ptr)++時,你會得到一些編譯時錯誤,比如「修改只讀位置」。手上

+0

如果你想增加你可以做的地址,就像ptr ++一樣,這也是有效的 –

0

(*ptr)++應該*(ptr++)

ptr指向第一個字符

(*ptr)返回的實際值

(*ptr)++是一個錯誤的原因(*ptr)將在返回右值R你情況)哪些不能被分配也不會遞增..還有ptr指向一個常量(不是C++的常量)char wh我不能改變!

你應該先增加ptr然後dereference它即*(ptr++)

誤區

字符串文字"xyz"總是在Ç視爲char但不能是modified。它們NOT宣稱爲const或者是不變的,如ot她的。它僅僅是不允許更改或未定義

C++字符串文字表示爲const焦炭這不能被chaged

+0

(* ptr)++不等於R ++。所以,這部分解釋是錯誤的。 (* ptr)這裏有左值,但由於是字符串文字和只讀,所以不能修改它。 – useratuniv

+3

R ++很混亂。 'R'沒有左值。休息很好。 – useratuniv

+0

@ rakesh.pandit hmmm..will include tht rvalue point – Anirudha

0

也許你正在嘗試做這樣的事情?

#include<stdio.h> 
    main() 
    { 

    char c = 'R'; 
    printf("%c\n",c); 
    c++; 
    printf("%c\n",c); 
    char aux[] = "Ramco Systems"; 
    char *p = aux; 
    printf("%c\n",(*ptr)); 
    (*ptr)++; 
    printf("%d\n",(*ptr)); 

}

但要記住,下面一行取消引用然後增加:

(*ptr)++; 

因此,這將表現爲如下:「爲了我在指着什麼信好了,改信到下一個字母(ASCII碼高1個字母的字母)「在這種情況下,將'R'改爲'S'。

如果你想要的是指向「一」,你應該做的:

ptr++; 

通過這樣做,你的增加,通過一個ptr指向的地址,通過指向下一個字符。