3

指针对很多事情都很有用,以至于有时无法理解它们在特定代码行中的含义。
例如,有时您使用指针来表示一系列元素:

char* char_array = "abcd";
int* int_array = malloc(5 * sizeof(*int_array));

有时您使用指针在堆上分配单个对象或使一个元素指向另一个元素:

int a = 5;
int* int_ptr = &a;
struct item* an_item = malloc(sizeof(*an_item));

当两者都使用碰撞时,连续的指针变得不可读:

    struct cell** board;
 // Does this represent a succession of cell allocated on the heap,
 // a succession of pointers to uniques cells (like an array),
 // a succession of pointers to multiples cells (like a two dimensional array)?

 // Of course the more you add pointers the more it becomes confusing.
    struct cell*** board;

我考虑过使用typedefor 宏来创建一个表示指针的类型,该指针用作引用或已被 malloc 编辑过的东西。
这可能是双刃剑,因为在某些情况下我会获得可读性,但它也会混淆代码。
您建议如何生成更易于理解指针含义的代码?

4

3 回答 3

1

您建议如何生成更易于理解指针含义的代码?

确实,指针的含义对于代码的局外人来说是不清楚的。我建议在变量名称前加上前缀以赋予它们更多含义。

参见:https ://en.wikipedia.org/wiki/Hungarian_notation#Examples

当然,您不必详细遵循此示例。您可以找到多种方式来添加前缀或组成自己的前缀。只要你在某个地方解释它,你应该是好的。

于 2016-01-31T09:52:35.633 回答
1

指针的含义始终相同。它实际上总是只指向一个对象。因此,指针是指向内存中单个位置的变量


至于你的不同例子

当你做类似的事情时

char* char_array = "abcd";
int* int_array = malloc(5 * sizeof(*int_array));

在这方面,指针char_array也指向单个char,它是a整个字符串的"abcd"。碰巧的是,由于它的初始化方式(字符串文字),有字符存储在下一个内存位置。


上面例子中的指针其实和char_ptr下面是一样的

char* char_array = "abcd";
char* char_ptr = char_array;

如果你喜欢这样

printf(" %c", char_ptr);

它会打印a

如果你做类似的事情

printf(" %s", char_ptr);

它将打印整个字符串"abcd"

在这里你可以看到,在声明中char_ptr也表现得如何,char_arrayprintf()

于 2016-01-31T09:38:03.417 回答
0

这与代码风格有关,因此可能会有不同的答案,而且它们都可能是正确的,但如果您愿意,可以呈现不同的风格 - 或观点。

我的建议是永远不要超过两个 *. 如果我记得我的 C 编码,我使用两个 * 仅用于 void ** 类型。

在所有其他情况下,使用 typedef(不是宏!)并为您的对象建立良好的结构。

使用 typedef,为每个级别创建名称。因此,如果您从 CELL 类型开始,并且想要这些数组,则将其命名为例如 CELL_LIST,这将是一个(指向)CELL 的数组。您想要 CELL_LIST 数组吗?例如,将其命名为 BOARD。

所以 CELL_LIST 是指向 CELL 的指针。BOARD 是指向 CELL_LIST 的指针(也可以命名为 ROW)。需要另一个维度?称它为 BOARD_LIST 或 BOARD_3D ...

于 2016-01-31T09:49:14.680 回答