我正在尝试了解一些代码的实现,这些代码使用 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
数组类型的自定义指针。
因此,inputstream
是 int (*)[2][15]
而 p
是 int [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)*15
到arr
和 *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/