什么类型是对数组变量的引用?

时间:2011-02-09 17:43:25

标签: c pointers reference

我有以下代码:

/*
 * Pointer to a function that reads a codesegment
 */
typedef bool (*BRCS)(void *, uint32, uint64 *, uint64 *, const char **, const char **);
BRCS get_prog_id;

/*
 * 'get_prog_id' is loaded from a dynamic library
 */

uint64 start_o;
uint64 length_o;
char prog_id[256];
char err[256];

get_prog_id(NULL, 0, &start_o, &length_o, &prog_id, &err);

当我运行编译器时,我收到以下警告:

passing argument 5 of get_prog_id from incompatible pointer type    
passing argument 6 of get_prog_id from incompatible pointer type    

所以,我抱怨说我的最后两个论点没有char **

我很困惑。我的理解是,表示TYPES数组的变量等同于指向TYPE的指针。因此,应用&运算符会为您指向指向TYPE的指针。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

这里有两个问题:

<强>(1)

&prog_id的类型不是char *,而是char (*)[256];即指向char-array-of-length-256。

<强>(2)

即使您可以获得char **(例如char *prog_id = malloc(256); &prog_id),但char ** const char **不兼容,原因有点模糊。最好的解释是:http://c-faq.com/ansi/constmismatch.html

答案 1 :(得分:1)

指针和数组类型仅相当于一个级别。每当另一层次的间接发挥作用时,它们就会不再相同。

如果您考虑在这种情况下应该使用什么指针算法,那么理解这是最简单的。请考虑以下定义:

typedef char tenchars[10];
tenchars *x;

现在,&(x[1])(即x+1)应该表示“x加上10个字符的地址”,对吧?但是,如果我执行以下操作会怎么样:

char **y = (char **)x;

&(y[1])现在意味着什么?为什么?

换句话说:指针数组与数组数组不同。因此,指向指针的指针与指向数组的指针不同。