通过在 C 中执行 "string" + 1 来截断

truncate by doing "string" + 1 in C

我最近在堆栈溢出时遇到了以下代码 (see the whole post here):-

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

它给 d 赋值“00939915”,我觉得这很违反直觉。

谁能解释一下这个过程的机制? 这个东西叫什么?

我是一名大一学生,正在学习 CS 入门课程,所以这会很有帮助:)

char *c = "200939915";

这里的c是一个指向一个字符的指针(200939915的第一个字符)。 c+1 将指向下一个字符。

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

c[0] = 2 c[1] = 0 c[2] = 0 c[3] = 9 等等。 c 是第一个字符 2 的地址。所以 d 是地址 c + 1,因此在这种情况下是第一个 0 的地址。

d不"contain"你说的值。 d 是指向 char 的指针,通过将其设置为 c+1,它指向(包含内存地址)您声明的字符串文字的第二个元素。

我猜你做了这样的事情 printf("%s",d); 这导致 printf 从 d 指向的位置开始读取内存并输出那里的每个字符,直到它捕获 '[=16=]' (字符串结尾)然后完成。

它不会截断您的字符串,您只是在另一个位置开始阅读它。

正如@Gaurav Sehgal 指出的那样,您的变量仅指向字符串,而不是数字。你期望 d 的值在这里是什么:

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