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 个整数或其他类型的数组。
我很困惑这两个符号表示什么。
我知道()
的优先级大于[]
,那是不是说明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 个整数或其他类型的数组。