我对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#中进行适当的分配:
第一个选项对我有意义。但是当看一下FOO(..)函数时,没有任何意义,因为FOO像数组一样使用“数据”。
任何人都可以给我一个提示吗?
谢谢,
迈克尔
答案 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);
由于data
是data_t
类型的指针,因此应用了指针算术,以便+ 1
比sizeof(data_t)
生成data
个字节。
所以你的第一个假设是正确的。