char *name[10] 和 char (*name)[10] 有什么区别?

What is the difference between char *name[10] and char (*name)[10]?

我很困惑这两个符号表示什么。 我知道()的优先级大于[],那是不是说明char(*name)[10]是指针,char *name[10]是数组?

int *a[10] - 声明一个包含 10 个整数指针的数组。

int (*a)[10] - 声明一个指向 10 个整数数组的指针。

这个声明

char *name[10];

声明一个包含 10 个元素的数组,类型为 char *

例如这样的数组可以用下面的方式初始化

char *name[10] = { "Peter", "Tom", "Michael" };

数组中所有没有相应初始化器的元素都将由NULL隐式初始化。即上面的声明等同于

char *name[10] = 
{ 
    "Peter", "Tom", "Michael", NULL, NULL, NULL, NULL, NULL, NULL, NULL 
};

指向数组第一个元素的指针看起来像

char **p = name;

指向整个数组的指针看起来像

char * ( *p )[10] = &name;

这个声明

char (*name)[10];

声明一个指向数组类型对象的指针char[10]

例如,如果你有一个声明为

的数组
char name_list[][10] =
{
    "Peter", "Tom", "Michael"
};

然后你可以像

一样声明一个指向数组第一个元素的指针
char (*name)[10] = name_list;

指向整个数组的指针可以这样声明

char ( *p )[3][10] = &name_list;

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    {
        char *name[10] = { "Peter", "Tom", "Michael" };

        char **p1 = name;
        puts( *p1 );
        
        char * ( *p2 )[10] = &name;
        puts( ( *p2 )[0] ); 
        // or 
        puts( **p2 );
    }
    
    putchar( '\n' );
    
    {
        char name_list[][10] =
        {
            "Peter", "Tom", "Michael"
        };
        
        char ( *p1 )[10] = name_list;
        puts( *p1 );
        
        char ( *p2 )[3][10] = &name_list;
        puts( ( *p2 )[0] ); 
        // or 
        puts( **p2 );
    }

    return 0;
}

程序输出为

Peter
Peter
Peter

Peter
Peter
Peter

*name[10]

是一个数组OF 10个指针。它们通常在处理二维数组时使用。

(*name)[10]

另一方面,这基本上是一个指针 TO 一个包含 10 个整数或其他类型的数组。