我正在尝试学习一些使用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的类型是什么?
答案 0 :(得分:1)
让我们分解一下。
typedef int PingPong_t[buffer_count][sample_size];
这将使PingPong_t
代表2D整数数组。
因此,您可以拥有
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
数组类型的自定义指针。
因此,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]);
提取pingpong_idx
指向的2D数组的第一行(inputstream
),并将其分配给pcmIn
。
此外,在上面的示例中,由于以错误的方式分配给数组,因此您得到了意外的结果。由于arr
是指向2D数组的指针,因此您需要为这样的元素分配一个值
(*arr)[0][1]=4;
而不是这样
*arr[0][1]=4;
。
后者将意味着arr
是2D指针数组,并且您基本上将第[0][1]
个指针的值设置为4,这不是您计划的值。
arr
不是2D数组,因此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。