首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C数组指针使用说明

C数组指针使用说明
EN

Stack Overflow用户
提问于 2015-11-18 15:45:22
回答 2查看 313关注 0票数 0

对于C中的数组指针,我有一个看似简单的问题。我正在尝试理解用C编写的一部分代码,这样我就可以将它移植到C#。数据类型和函数定义如下:

代码语言:javascript
复制
/* header file */
/* definition of data_t type */
typedef unsigned short uint16_t;
typedef uint16_t data_t;

/*  the function the type data_t is used */
#define FOO(d) do {
 d[0] = 1;
 d[1] = 2;
} while (0)

/* source file */
/* the function where FOO is used */
static int BAR(data_t* const data)
{
   FOO(data + 1);
}

调用FOO(..)在BAR(..)中,"data + 1“是什么意思?据我所知,数据是来自data_t类型的数组,我无法找到关于堆栈溢出的确切示例,因此我对它的含义感到困惑。在我的脑海中,我有三个选择:如何在C#中进行适当的分配:

  1. 数据+1 -> data1
  2. 数据+1 ->数据+1
  3. 数据+1 ->新data_tnew instance of data_t array at address + 1

第一个选择对我来说是有意义的。但是,当查看FOO(..)函数时,这是没有意义的,因为FOO使用的是像数组一样的“数据”。

有人能给我个提示吗?

谢谢,

迈克尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-18 15:50:21

在C语言中,指针和数组通常是可互换的。

在大多数情况下,data_t*等同于data_t[],并且使用数组表示法来简化对赋值指针的取消引用。

代码语言:javascript
复制
data[0] = 1;
data[1] = 2; 

可以用

代码语言:javascript
复制
*(data) = 1;
*(data+1) = 2;

虽然宏的使用很糟糕,但它确实只是语义。无论哪种方式,您都可以访问超出范围的内存位置,并在访问未分配的内存时造成麻烦。

更新:

代码语言:javascript
复制
*(data+1) != data + 1

data + 1 -指针数据+1*(指针的数据类型的大小)上的内存位置。换句话说,它是与数据位置相隔的一个单位。

*(data + 1) -在所述数据类型的内存位置的值。

票数 2
EN

Stack Overflow用户

发布于 2015-11-18 15:50:35

在这方面:

代码语言:javascript
复制
data + 1

指:

代码语言:javascript
复制
data + sizeof(data_t);

因为data是一个类型的指针,所以应用data_t指针算法,使得+ 1data更多地生成sizeof(data_t)字节。

所以你的第一个假设是正确的。

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

https://stackoverflow.com/questions/33784400

复制
相关文章

相似问题

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