我正在尝试学习一些代码的实现,这些代码使用类型定义函数到双精度数组,还使用指针,我在理解代码和关于代码如何工作、变量是什么类型以及什么指向什么的细节上遇到了一些困难。
我试着尝试不同的实现,并试图了解它是如何工作的,但我得到的结果并不是我所期望的。下面是我尝试测试的一些代码:
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 buffer的整数数组,但我很难向自己证明这一点,或者我只是不确定数据类型实际上是什么,以及它实际在做什么。
我可能有一个很好的问题是,输入流的类型是什么?inputstream是一个指向双精度整数数组的指针,这样说对吗?或者,inputstream是一个双精度整数指针数组?
那么pcmIn的类型是什么?
发布于 2019-06-11 03:58:27
让我们把它分解一下。
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
将将指向2D数组,即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
所指向的2D数组的第一行(pingpong_idx
),并将其赋值给pcmIn
。
此外,你在上面的例子中得到了意想不到的结果,因为你以错误的方式给数组赋值。因为arr
是指向二维数组的指针,所以您可以为像这样的(*arr)[0][1]=4;
元素赋值,而不是像这样的*arr[0][1]=4;
。
后者意味着arr
是一个2D指针数组,您基本上将[0][1]
的第4个指针的值设置为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]
元素的值设置为2。
https://stackoverflow.com/questions/56532128
复制相似问题