尝试在函数

时间:2016-09-06 13:20:21

标签: c pointers

我收到警告:

expected 'const CHAR *' but argument is of type 'CHAR (*)[18]'

为什么编译器会给我这个警告?这是我用来调用api的行:

AG_AS(g_AgMgrCtx.audio_device.Profile_Type,&g_AgMgrCtx.SDevAddr);

该功能的声明是

AG_AS(AG_DType d_type , CHAR *addr);
char SDevAddr[18];

传递地址有什么问题?当我删除&时,警告就会消失。

警告实际意味着什么?

2 个答案:

答案 0 :(得分:2)

这意味着您的电话应该是(没有&):

   AG_AS(g_AgMgrCtx.audio_device.Profile_Type, g_AgMgrCtx.SDevAddr);

g_AgMgrCtx.SDevAddr是一个包含18个字符的数组。因此,当您将它传递给函数时,它会转换为指向其第一个元素的指针(从而匹配AG_AS()期望的类型)。

相关:What is array decaying?

答案 1 :(得分:0)

当你有这样的对象时

T obj;

其中T是某种类型,则表达式&obj具有类型T *,它是指向T类型的对象的指针。

此数组声明

char SDevAddr[18];
可以使用typedef将

转换为上面显示的形式。例如

typedef char T[18];
T SDevAddr; 

在这种情况下,表达式&SDevAddr的类型为T *,如上所述。但在这种情况下,T又是char[18]类型的别名。因此&SDevAddr是指向char[18]类型对象的指针。它的类型看起来像char ( * )[18]

但是从功能声明中可以看出

AG_AS(AG_DType d_type , CHAR *addr);

第二个参数的类型为char *。如果您将作为参数传递数组本身,如SDevAddr,那么它将被隐式转换为指向其第一个元素的指针,并且将具有函数调用所需的类型char *