做「串」 + 1我最近遇到下面的代碼來對堆棧溢出(see the whole post here): -截斷通過用C
char *c = "200939915";
char *d = c + 1;
它指定的「00939915」 DA值,我覺得這非常反直觀。
有人可以解釋過程的機制嗎? 這個東西叫什麼?
我是一個大一的和做CS入門課程,因此這將是很大的幫助:)
做「串」 + 1我最近遇到下面的代碼來對堆棧溢出(see the whole post here): -截斷通過用C
char *c = "200939915";
char *d = c + 1;
它指定的「00939915」 DA值,我覺得這非常反直觀。
有人可以解釋過程的機制嗎? 這個東西叫什麼?
我是一個大一的和做CS入門課程,因此這將是很大的幫助:)
char *c = "200939915";
這裏c
是指向一個char(的200939915
的第一個字符)。 c+1
將指向下一個字符。
(2 0 0 9 3 9 9 1 5)
^^
| |
c c+1
謝謝老兄。我今年夏天做了CS50,你的回答只是幫助我連接點:p – aditya
@aditya也許是因爲我也採取了CS50。很高興我能幫上忙。 –
C [0] = 2個 C [1] = 0 C [2] = 0 C [3] = 9 等。 c
是該第一個字符的地址,2
。所以d
是地址c
+ 1以上,因此在這種情況下第一個0
的地址。
d
不會「包含」您所說的值。 d
是指向char
的指針,並將其設置爲c+1
它指向(包含內存地址)您聲明的字符串文本的第二個元素。
我想你做了這樣的事情printf("%s",d);
這導致printf的閱讀從位置d
點和輸出的每一個字符開始存儲在那裏,直到抓到一個'\0'
(字符串的結束),然後結束。
它不截斷你的字符串,你只是開始在另一個位置閱讀它。
正如@Gaurav Sehgal指出的那樣,您的變量只指向字符串,而不是數字。你認爲d的價值在這裏:
char *c = "abcdefghi";
char *d = c + 1;
我認爲它應該指向「b」 – aditya
你的課程教材是怎麼說的? Google搜索揭示了什麼?這些問題之前已經得到解答,所以你應該能夠找到答案。 – AntonH
'd'是一個指針,指向由'c'('c [1]')指向的數組中的第二個字符,而'c'指向第一個元素('c [0]')。所以如果你打印'd',自然會從第二個字符開始 – Alex
@AntonH我試着在stackoverflow上找到它,但不知道要搜索什麼(即它的名字)。 – aditya