cout和printf这些函数遇到字符串会自动处理,为了方便程序员,所以你说的两个疑惑都是函数自动处理的结果。
所以建议学习理解过程中先定义中间变量再输出,那样在检验理解上比较明确,当你定义的一个类型无法接受某个值的时候就说明理解错误了,其实我学习研究的时候,遇到疑惑的地方,就设断点跟踪,可以了解内存分配情况以及实际的变量值,包括指针。
另外,对于第二个问题,c是数组指针,是行地址指针,也就是指针的指针,所以*(c+1)是取出的是b[1]字符串中第一个字符的地址,类型是char *,是一级指针,每递增一个是一毁前戚个字符。而c是二纤陵级指针,每递增一个,是一个字符串,是b[1]字符串所在地址,类型是char (*)[4],虽然他们指向的地址值一样,但是类型不同,当然printf函数会自动处理,所以显示正确。
你可以用以下代码验证
char *pp=(c+1);//会报错 ,char (*)[4]类型悔档不能初始化char *类型的实体
char *p=*(c+1);//正确