2017-02-09 49 views
0

做「串」 + 1我最近遇到下面的代碼來對堆棧溢出(see the whole post here): -截斷通過用C

char *c = "200939915"; 
char *d = c + 1; 

它指定的「00939915」 DA值,我覺得這非常反直觀。

有人可以解釋過程的機制嗎? 這個東西叫什麼?

我是一個大一的和做CS入門課程,因此這將是很大的幫助:)

+0

你的課程教材是怎麼說的? Google搜索揭示了什麼?這些問題之前已經得到解答,所以你應該能夠找到答案。 – AntonH

+1

'd'是一個指針,指向由'c'('c [1]')指向的數組中的第二個字符,而'c'指向第一個元素('c [0]')。所以如果你打印'd',自然會從第二個字符開始 – Alex

+2

@AntonH我試着在stackoverflow上找到它,但不知道要搜索什麼(即它的名字)。 – aditya

回答

7
char *c = "200939915"; 

這裏c是指向一個char(的200939915的第一個字符)。 c+1將指向下一個字符。

  (2 0 0 9 3 9 9 1 5) 
     ^^ 
      | | 
      c c+1 
+0

謝謝老兄。我今年夏天做了CS50,你的回答只是幫助我連接點:p – aditya

+1

@aditya也許是因爲我也採取了CS50。很高興我能幫上忙。 –

1

C [0] = 2個 C [1] = 0 C [2] = 0 C [3] = 9 等。 c是該第一個字符的地址,2。所以d是地址c + 1以上,因此在這種情況下第一個0的地址。

2

d不會「包含」您所說的值。 d是指向char的指針,並將其設置爲c+1它指向(包含內存地址)您聲明的字符串文本的第二個元素。

我想你做了這樣的事情printf("%s",d);這導致printf的閱讀從位置d點和輸出的每一個字符開始存儲在那裏,直到抓到一個'\0'(字符串的結束),然後結束。

它不截斷你的字符串,你只是開始在另一個位置閱讀它。

1

正如@Gaurav Sehgal指出的那樣,您的變量只指向字符串,而不是數字。你認爲d的價值在這裏:

char *c = "abcdefghi"; 
char *d = c + 1; 
+0

我認爲它應該指向「b」 – aditya