我有一个简单的功能指针测试代码:
void PrintHello(char *name)
{
printf("Hello %s\n", name);
}
int main(int argc, const char * argv[])
{
//ptr is a function pointer
void (*ptr)(char*);
ptr = PrintHello;
ptr("world");
return 0;
}
代码构建&运行成功。打印出“Hello world”字符串。
但是,我不明白的是,函数PrintHello(char*)
接受指向字符串的指针作为参数。但我的代码通过函数指针 ptr("world")
调用此函数,其中我直接将字符串“world”传递给函数,而不是指向字符串的指针。为什么会这样?
答案 0 :(得分:4)
在C字符串中,文字的类型为char []
。将字符串文字传递给函数意味着您将指针传递给字符串的char *
类型的第一个元素。函数调用
ptr("world");
相当于
char name[] = "world";
ptr(name); // Name decays to pointer to first character of the string literal.
应该注意的是,字符串文字是不可修改的,因此在"world"
中ptr("world");
,但char
数组不一样。
在C ++中,字符串文字的类型为const char []
。这意味着函数ptr
必须具有const char *
类型的参数,而不是char *
。 (const char []
会衰减到const char *
)。
答案 1 :(得分:1)
函数PrintHello(char *)接受指向字符串
的指针
不,它没有。它接受指向char
的指针。
但我的代码通过函数指针
调用此函数
WRT论点并不重要'通过。
我直接传递了字符串" world"功能
你没有。您传递了一个文字,这与将指针传递给第一个元素(C中的char*
,C ++中的const char*
)相同。
为什么会这样?
如上所述,通过函数指针调用函数的事实并不重要。所以它像普通电话一样工作。话虽如此,在C ++中,将字符串文字传递给采用非常量指针的函数是非法的。