首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >定义为双精度整型数组

定义为双精度整型数组
EN

Stack Overflow用户
提问于 2019-06-11 03:04:03
回答 1查看 167关注 0票数 1

我正在尝试学习一些代码的实现,这些代码使用类型定义函数到双精度数组,还使用指针,我在理解代码和关于代码如何工作、变量是什么类型以及什么指向什么的细节上遇到了一些困难。

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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的类型是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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数组类型的自定义指针。

因此,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所指向的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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56532128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档