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

Arrays char*name[10]和char(*name)[10]之间有什么区别?,arrays,c,pointers,declaration,implicit-conversion,Arrays,C,Pointers,Declaration,Implicit Conversion,我对这两种符号的含义感到非常困惑。 我知道()的优先级大于[],这是否意味着char(*name)[10]是指针,而char*name[10]是数组?int*a[10]声明了一个包含10个指向整数指针的数组 int(*a)[10]-声明一个指向10个整数数组的指针。此声明 char *name[10]; char (*name)[10]; 声明类型为char*的10个元素的数组 例如,这样的数组可以通过以下方式初始化 char *name[10] = { "Peter",

我对这两种符号的含义感到非常困惑。
我知道
()
的优先级大于
[]
,这是否意味着
char(*name)[10]
是指针,而
char*name[10]
是数组?

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

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

此声明

char *name[10];
char (*name)[10];
声明类型为
char*
的10个元素的数组

例如,这样的数组可以通过以下方式初始化

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 **p = name;
char * ( *p )[10] = &name;
本声明

char *name[10];
char (*name)[10];
声明指向数组类型为
char[10]
的对象的指针

例如,如果有一个数组声明为

char name_list[][10] =
{
    "Peter", "Tom", "Michael"
};
char ( *p )[3][10] = &name_list;
然后可以声明指向数组第一个元素的指针,如

char (*name)[10] = name_list;
指向整个数组的指针可以声明为

char name_list[][10] =
{
    "Peter", "Tom", "Michael"
};
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;
}
*姓名[10]

是由10个指针组成的数组。它们通常用于处理二维阵列

(*姓名)[10]


另一方面,它基本上是一个指向10个整数数组的指针。

是的,带有
char(*name)[10]
name是指向10个字符数组的指针(
name=malloc(1000*sizeof*name);strcpy(name[123],“foobar”);
);使用
char*name[10]
name是一个由10个指向char的指针组成的数组(
name[4]=malloc(42);
)。哦,我认为char*name[10]是指向数组“name”的第一个元素的指针,即name[0]。
sizeof(char(*)[10])
比sizeof(char 10])小10倍。@NeerajKumar认为char name[10]是指针”-->数组不是指针。指针不是数组。正如您第一次查询的那样:“char*name[10]是一个数组”。哦,我认为char*name[10]是指向数组“name”的第一个元素的指针,即name[0]。感谢您澄清我的疑问。请注意字符串文本是
const
<代码>常量字符*名称[10]={“彼得”、“汤姆”、“迈克尔”}会更正确。@124312341234123411234123在C中,字符串文字不是常量,即使代码不应该尝试更改它们。@12431234123412341234123在C中字符串文字具有非常量字符数组的类型,尽管您不能更改字符串文字。