C 数组指针用法说明

C array pointer usage clarification

关于 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_t 类型的数组。 我无法在 Whosebug 或其他方面找到确切的示例,因此我对它的含义感到困惑。 在我的脑海中,我有三个选项如何在 C# 中进行适当的赋值:

  1. 数据 + 1 -> 数据[1]
  2. 数据 + 1 -> 数据[0] + 1
  3. data + 1 -> new data_t[](data_t 数组的新实例地址 + 1)

第一个选项对我来说很有意义。但是当查看函数 FOO(..) 时,它没有任何意义,因为 FOO 像数组一样使用 "data"。

谁能给我提示?

谢谢,

迈克尔

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

data_t*在大多数情况下等同于data_t[],数组符号的使用是为了简化赋值指针的解引用。

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

可以换成

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

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

更新:

*(data+1) != data + 1

data + 1 - 指针数据的内存位置 + 1 *(指针数据类型的大小)。也就是比data的位置多了一个单位。

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

在此上下文中:

data + 1

表示:

data + sizeof(data_t);

因为 data 是类型为 data_t 的指针,因此应用了指针算法,因此 + 1data 多了 sizeof(data_t) 个字节。

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