关于c语言中字符串的存储有关问题

关于c语言中字符串的存储问题
请问:字符串在内存中是如何存储的?
今天看到一个这个题目
#include <stdio.h>
int main (void)
{
char *s = "abcde";
s += 2;
printf ( "%s\n", s );

return 0;
}

/* 运行结果: cde*/
谁能给我详细解释一下为什么是这个结果, s是指针存储的不是地址吗?为什么可以以字符串的形式输出?

------解决方案--------------------
“abcde”字符串常量自动把首地址给s,s+=2;则地址偏移到指向第三个字符位置。
输出字符串有printf来完把地址起点开始提取字符串并输出显示的。
------解决方案--------------------
知道是一个地址 就从那个地址开始往后读 直到结束符为止,也就是你用%s取的字符串。 *s是直接对那个地址解引用:
“abcde”字符串常量自动把首地址给s,s+=2;则地址偏移到指向第三个字符位置。
输出字符串有printf来完把地址起点开始提取字符串并输出显示的。