【问题标题】:What does *arr[] mean? [closed]*arr[] 是什么意思? [关闭]
【发布时间】:2016-07-09 10:37:07
【问题描述】:

我有这个代码来自我之前的考试,这是我第一次看到这个*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");
}

【问题讨论】:

  • 这确实是一个初学者的问题。你可以在任何像样的 C 书籍的初始页面中了解这一点。
  • @machine_1 哦,真的,如果“初学者的问题”困扰您,您可以直接忽略它!
  • 它可以帮助google上的搜索过程更快,我相信很多其他初学者也有这个问题。这可能是一个快速的寻求帮助!

标签: c arrays matrix


【解决方案1】:

*arr[] 是什么意思?

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

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

  1. 带初始化器的变量定义(根据 OP 的 sn-p)

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

    这定义了一个指向int指针 数组,其元素数由其初始化程序中的元素数决定。在上面的示例中,arr 将包含三个元素。

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

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

    void foo(int * arr[]);
    

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

明确说明这一点:no 情况下,int * arr[] 定义任何 ints。

【讨论】:

  • 里面是数字吗?如果是,它们是什么
  • 大小是多少?如初始值设定项所示,元素的数量为 3。 sizeof(arr) 是指针中的字节数。
  • @lasvegasnay "it":谁?数组的元素?是的,由初始化程序给出的值:{ m[0], m[1], m[2] };
  • @nicomp:澄清措辞。
  • @sjsam:“整数数组”与“整数数组”:我更喜欢前者,因为后者可以以每个数组元素可能的方式解释包含“整数”,这不仅仅是一个“整数”,绝对不是这种情况。 “整数数组”也与实际编码一致:int a[42]。从英语语法的角度来看,“整数数组”可能是错误的。我觉得复数已经带有“数组”了。
【解决方案2】:

线

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])都是一个由 int 组成的 4 元素数组;但是,在大多数情况下,“T 数组”类型的 表达式 将被转换(“衰减”)为“指向 T”的类型的表达式,并且表达式将是数组的第一个元素的地址,所以上面的行相当于

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

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

【讨论】:

    【解决方案3】:

    声明

    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]

    【讨论】:

    • @alk :我说arr 有类型吗?对不起,我没有得到你
    • 我将“declare”读作“define”,这不一样,sry。
    猜你喜欢
    • 2018-07-17
    • 2022-06-16
    • 1970-01-01
    • 2010-12-29
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多