c语言指针问题,请问下列四个注释里的内容分别代表什么意思?


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] = %p\n", i, &*names[i] );
         //printf("Value of names[%d] = %p\n", i, &names[i] );
      //printf("Value of names[%d] = %p\n", i, *names[i] ); 
      //printf("Value of names[%d] = %p\n", i, names[i] );
      
      
   }
   return 0;
}

%p是将后面的变量按十六进制的地址格式输出。
&*names[i]相当于每个字符串第一个字符的地址,相当于字符串的首地址
&names[i]是每个字符串的首地址的地址。相当于names+i
*names[i]是每个字符串第一个字符
names[i]是每个字符串首地址

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

names[i]就是字符串的首地址,比如names[0]就是字符串"Zara Ali"的地址
&*names[i]是字符串第一个字母的地址,跟字符串的地址是一样的。比如,&*names[0]得到的就是字符Z的首地址,这个地址跟字符串"Zara Ali"的首地址是一样的。

const char *names[] 首先这是一个常量字符指针数组,数组的元素是字符串
&*names[i] 如果i = 0,则这个表示第一个元素的地址
&names[i] 如果i = 0, 则这个表示存放第一个字符串地址的地址
*names[i] 如果i = 0,则这个表示,第一个元素的第一个字符
names[i] 如果i = 0, 则这个表示第一个元素的地址