提问人:Neeraj-Kumar-Coder 提问时间:12/15/2020 最后编辑:Neeraj-Kumar-Coder 更新时间:12/15/2020 访问量:1914
char *name[10] 和 char (*name)[10] 有什么区别?
What is the difference between char *name[10] and 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
请注意,字符串文本是 . 会更正确。const
const 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 个整数或其他数组的指针。
评论
char (*name)[10]
name = malloc(1000 * sizeof *name); strcpy(name[123], "foobar");
char *name[10]
name[4] = malloc(42);
sizeof(char (*)[10] )
将小 10 倍sizeof(char *[10])