onemoo
char s{10] = "abcd";"abcd" 这样的字符串字面量其实就是字符数组,并且会带有结尾的 '\0' 字符,就是说它实际上相当于是 {'a', 'b', 'c', 'd', '\0'} 数组。而且字符串字面量可以用来初始化字符数组,这样字符数组元素就依次得到这字符串字面量中的字符。字符数组比初始化字符串更大的话,多出来没有得到初值的字符元素的值就是 '\0'。所以 s 数组在初始化之后其中的字符就是 {'a', 'b', 'c', 'd', '\0', '\0', ... 后面都是 '\0'}printf 的 %s 对应字符串,C 语言的字符串就是以 '\0' 结尾的字符数组,所以后面对应传入了 s。如果你还记得数组实参的隐式转型的话,这里传入的其实是“指向 s 首元素的指针”,而 printf 就从这个指针所指的字符开始打印,直到 '\0' 为止。那么 printf("%s\n",s); 这个语句,既然 s 是指首元素的指针,所以 printf 就从 s 数组的第一个 'a' 开始打印。虽然 s 数组一共有 10 个元素,但是第 5 个元素就是 '\0',这就视为字符串结尾,所以会打印出 abcd。至于你说的 printf("%s\n",s + i);这个 i 肯定是个整型数,s + i 是指针和整型的加法,这相当于得到指向 s 指针向后跳 i 位的指针。那么实际传入 printf 的指针就是从 s 数组开头向后跳 i 位的指针,printf 就会从所指的那个字符开始打印。所以“printf("%s\n",s+i);而不是这个printf("%s\n",s);是这两种写法都行吗?”如果 i 是整型,那这两种写法都是合法的。如果 i 也不会跳出数组 s 的范围,那么第二种写法也是合理的,运行没有问题。当然两种写法打印出的结果就可能不同了。只有 printf("%s\n", s + 0) 的结果才会和 printf("%s\n", s) 一样。