字符串数组与指针问题

#为何 q明明已经指向了字符串数组中的第一个字符串,为何输出会是下图结果?

img

int main()
{
    char a[][10]={"dddd","aaaa","cccc","bbbb","eeee","llll","kkkk","oooo","pppp","cccc"};
    int i;
    for(i=0;i<10;i++)
    {
        
        printf("%s\n",a[i]);
        
    }
    printf("\n");
    char *q=a[0];
    printf("%s",*q);
    
//    exchange(a[0]);
//    printf("排序后"); 
//    for(i=0;i<10;i++)
//    {
//        
//        printf("%s\n",a[i]);
//        
//    }
    
    
    
}

printf("%s",*q); 输出用 *q, 此时 *q 等价于 a[0][0] 即字符 'd' , 而前面格式控制符用 %s ,显然前后不符,会出错的。如想输出的是字符串,则将q前面的 * 星号删除即可。

printf("%s",q);
因为q=a[0],这样q就是一个字符串了,不能再加星号了,*q是一个字符,不是字符串,用%s输出就崩溃了

该回答引用GPTᴼᴾᴱᴺᴬᴵ
问题出在最后一行的printf语句上,应该是printf("%s", q)而不是printf("%s", *q)。
·
因为char *q=a[0]将q指向了字符串数组a的第一个元素,即第一个字符串"dddd"的首地址。而在最后一行的printf("%s",q)中,q表示取出q指向的内存地址中存储的值,即字符串"dddd"的第一个字符'd'。而不是字符串"dddd"本身。
·
正确的方式应该是printf("%s", q),这样会输出q指向的字符串。