输出指针数组中个元素

#include<stdio.h>
int main()
{
char *a[4] = {"this", "is", "a", "test!"};
char b[][4] = {"aaa", "bbb"};
char (*c)[4];
c = &b[0];
printf("%s %s %s\n", a[0], b[0], *(c+1));
return 0;
}
问题1:char *a[4] 是一个指针数组,那么数组中的每一个元素都应该是一个指针,指针指的是地址,那么为什么在输出a[0]时,不写成*a[0],因为这样才是取值?
问题2:char (*c)[4]是一个数组指针,我用它指向一个二位数组,为什么当我想输出''bbb''时,写*(c+1)和写c+1的都可以,我个人觉得第一种写法是取地址b[1]的值,为什么第二种写法也可以输出想要的结果?

先谢过各位了

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);//正确