c - Typedef 到双整数数组

标签 c arrays pointers typedef

我正在尝试了解一些代码的实现,这些代码使用 double 组的 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 是一个指向双整数数组的指针是否正确?还是 inputstream 是整数指针的双数组?

那么 pcmIn 的类型是什么?

最佳答案

让我们分解一下。

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].

假设我们有类似的东西

输入流 = &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,而是 int 的二维数组。

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

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

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

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

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

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

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

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

关于c - Typedef 到双整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56532128/

相关文章:

c++ - 如何包装抽象类的指针列表?

c++ - 传递给函数的数组差异

c - 如何在 C 中存储指向已分配内存区域的偏移位置的指针?

c - 将 int 类型转换为 char *

ruby - 使用作为字符串存储在数组中的数学符号

javascript - FP 方式的数组嵌套映射

创建数组并使用指针访问它们

c - 在 Linux 设备驱动程序中使用 do_mmap()

c - 3 table 三角图案

arrays - 计算列表中 k 个最大数字之和的有效方法?