c - *arr[] 是什么意思



我有我以前的考试中的代码,这是我第一次看到这个*arr[]。 那是什么意思?是矩阵还是数组?它包含什么?

#include <stdio.h>
void f2(int **a, int x, int y);
int main()
{
  int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}};
  int *arr[] = { m[0], m[1], m[2] };
  f2(arr, 3, 4);
  _getch();
  return 0;
}
void f2(int **a, int x, int y)
{
  if (x > 0)
  {
    int i, j = 0, *p = a[x - 1];
    for (i = 0; i < y; i++)
    {
      if (!(p[i] % 3))
        printf("%d ", p[i]);
    }
    f2(a, x - 1, y);
  }
  else
    printf("n");
}

*arr[]是什么意思?

作为独立表达式*arr[]无效。

对于变量定义,这里有两种含义,具体取决于此类表达式出现的上下文:

  1. 使用初始化器的变量定义(根据 OP 的代码片段)

    int * arr[] = { m[0], m[1], m[2] };
    

    这定义了指向int指针数组,其元素数量由其初始化器中的元素数量决定。在上面的示例中,arr将有三个元素。

  2. 函数参数列表中的变量定义

    如果像这样使用,那就是在函数声明/定义中

    void foo(int * arr[]);
    

    它实际上定义了一个int **,一个指向int的指针在函数声明/定义的上下文中,int * arr[]int ** arr是等价的,或者更一般的T*[]等于T**

明确声明这一点:在任何情况下,int * arr[]都不会定义任何int

int *arr[] = { m[0], m[1], m[2] };

arr声明为指向int的指针数组;数组的大小由初始值设定项的数量(3)决定。 这和写作是一样的

int *arr[3];
arr[0] = m[0];
arr[1] = m[1];
arr[2] = m[2];

每个初始值设定项(m[0]m[1]m[2])都是一个 4 元素的 int 数组;然而,在大多数情况下,"T数组"类型的表达式将被转换("衰减")为"指向T的指针"类型的表达式,并且表达式的值将是数组第一个元素的地址。 所以上面的一行相当于

int *arr[] = { &m[0][0], &m[1][0], &m[2][0] };

arr 中的每个元素都是指向 int 的指针,而不是 int 数组。 由于 C 中的数组下标的工作方式,arr[i][j] 会给你与 m[i][j] 相同的结果。

通过语句

int *arr[]; // int* arr[] is also true but stick on to one format.

声明指向整数的指针数组。

揭秘 :

int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}};
  • m是一个数组。
  • m[0]m[1]m[2]指向int[4]。第 #A 点
  • m[0][0]是一个整数。

#A 点可以理解m[0]m[1]m[2]是指针。

揭秘 :

int *arr[] = { m[0], m[1], m[2] };
  • arr[0]arr[1]arr[2]分别分配给m[0], m[1], m[2]
  • m[1][2]相当于arr[1][2]

最新更新