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

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

提问人:Neeraj-Kumar-Coder 提问时间:12/15/2020 最后编辑:Neeraj-Kumar-Coder 更新时间:12/15/2020 访问量:1914

问:

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

数组 C 指针 声明 隐式转换

评论

5赞 Inian 12/15/2020
cdecl.org
1赞 pmg 12/15/2020
是的,with name 是指向 10 个字符数组的指针 ();with name 是一个包含 10 个指向 char () 的指针的数组。char (*name)[10]name = malloc(1000 * sizeof *name); strcpy(name[123], "foobar");char *name[10]name[4] = malloc(42);
0赞 Neeraj-Kumar-Coder 12/15/2020
哦,我以为 char *name[10] 是指向数组“name”的第一个元素的指针,即 name[0]。
0赞 12431234123412341234123 12/15/2020
sizeof(char (*)[10] )将小 10 倍sizeof(char *[10])
0赞 chux - Reinstate Monica 12/15/2020
@NeerajKumar “认为 char *name[10] 是一个指针” --> 数组不是指针。指针不是数组。正如您第一次查询的那样:“char *name[10] 是一个数组”。

答:

6赞 0___________ 12/15/2020 #1

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

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

评论

0赞 Neeraj-Kumar-Coder 12/15/2020
哦,我以为 char *name[10] 是指向数组“name”的第一个元素的指针,即 name[0]。
7赞 Vlad from Moscow 12/15/2020 #2

本声明

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

评论

1赞 12431234123412341234123 12/15/2020
请注意,字符串文本是 . 会更正确。constconst char *name[10] = { "Peter", "Tom", "Michael" };
1赞 chux - Reinstate Monica 12/15/2020
@12431234123412341234123在 C 中,即使代码不应尝试更改字符串文字,字符串文字也不是。const
0赞 Vlad from Moscow 12/15/2020
@12431234123412341234123在 C 中,字符串文本具有非常量字符数组的类型,尽管您不能更改字符串文本。
1赞 Abdodt 12/15/2020 #3

*姓名[10]

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

(*姓名)[10]

另一方面,这基本上是指向 10 个整数或其他数组的指针。