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 -> 数据[0] + 1
- 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
的指针,因此应用了指针算法,因此 + 1
比 data
多了 sizeof(data_t)
个字节。
所以你的第一个假设是正确的。
关于 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 -> 数据[0] + 1
- 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
的指针,因此应用了指针算法,因此 + 1
比 data
多了 sizeof(data_t)
个字节。
所以你的第一个假设是正确的。