ELI5:`int * p []`

时间:2018-12-05 13:10:19

标签: c++ c arrays pointers types

我不知道它的数据类型是什么。如果是指针或数组。请简单说明。引用书中的内容-

  

如果要将指针数组传递给函数,则可以使用与传递其他数组相同的方法-只需使用没有任何索引的数组名称调用该函数。例如,可以接收数组x的函数如下所示:

void display_array(int *q[])
{
  int t;
  for(t=0; t<10; t++)
    printf("%d ", *q[t]);
}
  

请记住,q不是指向整数的指针,而是指向数组的指针   整数。因此,您需要将参数q声明为整数指针数组,   如图所示。您不能简单地将q声明为整数指针,因为这不是   是什么。

引用:C ++:完整参考,第4版,由Herbert Schildt撰写,第122-123页

4 个答案:

答案 0 :(得分:4)

  

...指向整数指针数组的指针

不,不是。 q是类型int *[]。在C ++中,这是无效的类型(取决于上下文,可能是不完整的类型),并且仅在C中的某些位置有效。数组必须具有大小。

类型int *[]是指向int的指针(大小不一)。它本身不是指针。


这种困惑可能是由于数组可以衰减到指向其第一个元素的指针这一事实。

例如,假设我们有这个数组:

int a[20];

使用普通a时,它会衰减为指向其第一个元素的指针:a等于&a[0]

答案 1 :(得分:3)

这是它的构建方式:

  • int类型“ int”。
  • int*类型“指向int的指针”
  • int* [] type “指向int的指针的数组(边界/长度未知)”
  • int* p[]是上述类型的名为 p 的变量或参数的声明

答案 2 :(得分:2)

   int *p[]
//      ^

p

   int *p[]
//       ^^

p是大小不确定的数组 (可能是非法的,取决于上下文)

   int *p[]
// ^^^^^

p是未指定大小的数组,该数组的大小为 int的指针

p的每个元素均是一个指针:

int foobar = 42;
p[0] = NULL;
p[1] = &foobar;

答案 3 :(得分:1)

  

我不知道它的数据类型是什么

如果可以的话,您正在阅读的书的作者也不会。

  

请记住,q不是指向整数的指针,而是指向整数的指针数组的指针。

这是bullschildt

  • 参数调整之前,q是一个整数指针数组。
  • 参数调整后,q是指向整数的指针数组的第一个元素的指针。等效于指向int** q的指针int

它在哪里都不是“指向整数的指针数组的指针”。那应该是int* (*q)[]

我建议不要再读那本书。

此处的关键是,作为函数参数列表一部分的任何数组都将调整(“衰减”)为指向第一个元素的指针。因此,无论您键入int* q[666]还是int* q[]都无关紧要,编译器将在命令行后面用int**默默地替换其中一个。

这实际上就是我们可以在参数列表中写入[]的原因-通常,空数组将是一个不完整的类型,在其他地方完成之前不能使用。但是,由于总是对参数进行调整,因此它们从来都不是数组类型,并且原始类型不完整也没关系。