做“串” + 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