C语言printf输出时指针为什么不带*

问题遇到的现象和发生背景

printf("Value of names[%d] = %s\n", i, names[i] );
为什么_names[i]_不用带*?

问题相关代码,请勿粘贴截图
#include <stdio.h>
 
const int MAX = 4;
 
int main ()
{
   const char *names[] = {
                   "Zara Ali",
                   "Hina Ali",
                   "Nuha Ali",
                   "Sara Ali",
   };
   int i = 0;
 
   for ( i = 0; i < MAX; i++)
   {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }
   return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

这里输出的是字符串,可以看到使用的是%s,输出字符串时可以不加*,因为字符数组直接写数组名就表示使用它的首地址
同理,调用函数传参的时候也可以不加

const char *names[] 定义的是指针数组,names[i] 保存的就是地址值。

我们在打印一个字符串时,只需要在对应的打印语句上添加该字符串的首地址,例如:

#include<stdio.h>
int main()
{
char str[6]="Hello";
printf("%s",str);
return 0;
}

str 就是我们要打印的字符串的首地址。
而在你的问题中,char *names[] 是定义了一个指向字符串的指针数组 names ,
数组 names 的每个元素都是一个字符串的首地址,
如果我们在 names[i] 前加 * ,返回的实际上是特定字符串的首字母。
我们可以试验一下,将你的代码改成:

printf("Value of names[%d] = %c\n", i, *names[i] );

会发现结果变成了:

img


这就说明这样的猜测是没错的。
对于 names 数组,我们也可以将它理解成一个二维数组:

img