【发布时间】:2014-01-31 19:35:36
【问题描述】:
我觉得 C 中的三重指针被视为“坏”。对我来说,有时使用它们是有意义的。
从基础开始,单指针有两个用途:创建数组,以及允许函数更改其内容(通过引用传递):
char *a;
a = malloc...
或
void foo (char *c); //means I'm going to modify the parameter in foo.
{ *c = 'f'; }
char a;
foo(&a);
双指针可以是二维数组(或数组数组,因为每个“列”或“行”的长度不必相同)。我个人喜欢在需要传递一维数组时使用它:
void foo (char **c); //means I'm going to modify the elements of an array in foo.
{ (*c)[0] = 'f'; }
char *a;
a = malloc...
foo(&a);
对我来说,这有助于描述 foo 正在做什么。但是,这不是必需的:
void foo (char *c); //am I modifying a char or just passing a char array?
{ c[0] = 'f'; }
char *a;
a = malloc...
foo(a);
也可以。
根据this question的第一个答案,如果foo要修改数组的大小,则需要双指针。
人们可以清楚地看到如何需要 三重指针(实际上还有更多)。在我的情况下,如果我传递一个指针数组(或数组数组),我会使用它。显然,如果您要传入一个正在更改多维数组大小的函数,则需要这样做。数组数组的数组当然不是太常见,但其他情况是。
那么有哪些约定呢?这真的只是样式/可读性的问题,再加上许多人很难理解指针这一事实吗?
【问题讨论】:
-
创建一个指向不透明类型的双指针(它本身可能最终成为一个指针)是不是很罕见?即
typedef struct foo *foo_t;,然后是foo_t **bar -
看看指向指针的指针如何成为 C 语言的独特“卖点”(与 Java 和其他语言相比):stackoverflow.com/questions/18373657/…
-
此外:如果我要“从基础开始”关于指针,它们与数组的关系并不是我认为的基础。指针的基本目的是将存储位置作为数据进行操作。其中一些存储位置恰好是特定数量的数组,这是一个有趣的细节,但不是基本的。
-
通过使用
typedef,代码可以减少变量或参数声明中*的数量。foo(bar *a)很好地将a呈现为指向bar类型的指针,即使typedef int **** bar也是如此。建议应始终避免使用 3+*,仅在特定情况下使用 2*。 -
@EricLippert:StackOverflow 是放置信息的好地方。我正在问一个问题,虽然是一个不太实际的问题。尽管如此,其中许多问题(即使是不太受欢迎的问题)仍会出现在搜索结果中并为人们提供帮助。
标签: c pointers coding-style