【问题标题】:Typedef to a double array of intsTypedef 到一个双整数数组
【发布时间】:2019-06-10 19:04:03
【问题描述】:

我正在尝试了解一些代码的实现,这些代码使用 typedef 到双精度数组并还使用指针,但我在理解代码和有关代码如何工作的详细信息以及变量是什么类型以及什么方面遇到了一些困难指向什么。

我尝试过尝试不同的实现并试图了解它是如何工作的,但我得到的结果并不是我所期望的。 这是我尝试测试的一些代码:

typedef int array[2][6];
array *arr;
arr = (array*)malloc(sizeof(array));
*arr[0][0]=2;
*arr[0][1]=4;

*arr[1][0]=3;
*arr[1][1]=5;
printf("line 1: %d %d\nline 2: %d %d\n",*arr[0][0],*arr[1][0],*arr[0][1],*arr[1][1]);
int *in = (int*) ((*arr)[0]);
printf("in = %d\n",in[1]); // results are unexpected

我实际查看的代码是用于乒乓缓冲区的,并且(简化)如下:

int buffer_count = 2; // 2 ping pong buffers
int sample_size = 15;
typedef int PingPong_t[buffer_count][sample_size];

PingPong_t *inputstream;

// logic goes here to determine pingpong_idx
int pingpong_idx = 0; // I believe this is to choose the first or second buffer

int *pcmIn = (int*)((*inputstream)[pingpong_idx]);

// do processing

我希望 pcmIn 是当前 ping 或 pong 缓冲区的整数数组,但我无法向自己证明这一点,或者我只是不确定数据类型实际上是什么以及它实际上在做什么。

我可能有一个很好的问题,输入流的类型是什么?说 inputstream 是一个指向双精度整数数组的指针是否正确?或者输入流是整数指针的双数组?

那么 pcmIn 的类型是什么?

【问题讨论】:

  • 为什么第一个代码块的结果出乎意料?它在我的机器上打印in = 2
  • 当我将索引更改为 1 时,它会打印出意想不到的结果
  • 为编程语言添加标签可能会让事情变得更清晰。
  • 所有*arr[x][y] 表达式都应该是(*arr)[x][y]

标签: c arrays pointers typedef


【解决方案1】:

让我们分解一下。

typedef int PingPong_t[buffer_count][sample_size];

这将使PingPong_t 表示一个二维整数数组。 所以,你可以拥有

PingPong_t p = {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},{3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}};

然后,我们将指向该类型的指针声明为

PingPong_t *inputstream;

这意味着inputstream 是指向PingPong_t 所代表的任何内容的指针。它不是数组,也不是指针数组,只是一个指针。

由于 PingPong_t 本质上表示int x[2][15],因此inpustream 将表示int (*y)[2][15]

假设我们有类似的东西

inputstream = &p;

然后,inputstream指向 到 p 的二维数组。二维 (2 x 15) int 数组类型的自定义指针。

所以,inputstreamint (*)[2][15]pint [2][15]

现在,更进一步,让我们假设我们要增加 inputstream

增加一个指针会增加它所指向的类型的大小。

因此,在我们的例子中,递增 inpustream 会增加 sizeof(int)*2*15,即 120(我的机器有 4 字节 int)。请注意,它不会在此处添加sizeof(int),因为它的基本类型不是int,而是ints 的二维数组。

最后,pcmIn 是一个int 指针(这里可以认为是一维数组),我们是这样赋值的

int *pcmIn = (int*)((*inputstream)[pingpong_idx]);

获取inputstream指向的二维数组的第一行(pingpong_idx),并将其分配给pcmIn

此外,您在上面的示例中得到了意想不到的结果,因为您以错误的方式分配给数组。由于arr 是指向二维数组的指针,因此您可以将值分配给这样的元素 (*arr)[0][1]=4; 而不是这样 *arr[0][1]=4;.

后者意味着arr 是一个二维指针数组,您基本上将[0][1]th 指针的值设置为4,这不是您的计划。

arr 不是二维数组,因此arr[0][1] 意味着将sizeof(int)*15 添加到arr 的值中,而*arr[0][1] 基本上是在该地址获取/设置值。实际上,[0][1]th 值仍未初始化。

但是,*arr[0][0]=2;printf("in = %d\n",in[0]); 是如何工作的呢?

因为,*arr[0][0]=2; 会将 [0][0]th 元素的值设置为 2。

【讨论】:

  • 谢谢,正是我想要的。所以说 PingPong_t 是 2 维整数数组 (2x15) 类型是正确的。输入流是指向二维整数数组(2x15)的指针类型。所以 *inputstream 是(不是指针)而是实际的二维整数数组本身。
  • 是的,(*inputstream) 将是实际的二维数组。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2016-09-27
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多