C数组指针用法说明

时间:2015-11-18 15:45:22

标签: c arrays pointers increment

我对C中的数组指针有一个看似简单的问题。我试图理解用C编写的一部分代码,所以我可以把它移植到C#。数据类型和功能定义如下:

/* 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);
}

在BAR(..)中调用FOO(..)时,“data + 1”是什么意思?据我所知,data是data_t类型的数组。 我无法在stackoverflow上找到一个确切的例子,或者因此我对它的含义感到困惑。 我在脑海中有三个选项,如何在C#中进行适当的分配:

  1. 数据+ 1 - >数据[1]
  2. 数据+ 1 - >数据[0] + 1
  3. 数据+ 1 - > new data_t [](地址+ 1处的data_t数组的新实例)
  4. 第一个选项对我有意义。但是当看一下FOO(..)函数时,没有任何意义,因为FOO像数组一样使用“数据”。

    任何人都可以给我一个提示吗?

    谢谢,

    迈克尔

2 个答案:

答案 0 :(得分:2)

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

在大多数情况下,

data_t*等同于data_t[],并且使用数组表示法来简化指针的解除引用以进行赋值。

data[0] = 1;
data[1] = 2; 

可以替换为

*(data) = 1;
*(data+1) = 2;

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

更新

*(data+1) != data + 1

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

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

答案 1 :(得分:2)

在此背景下:

data + 1

意思是:

data + sizeof(data_t);

由于datadata_t类型的指针,因此应用了指针算术,以便+ 1sizeof(data_t)生成data个字节。

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