功能指针

时间:2015-02-19 11:09:12

标签: c++ c pointers function-pointers

我有一个简单的功能指针测试代码:

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”传递给函数,而不是指向字符串的指针。为什么会这样?

2 个答案:

答案 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 ++中,将字符串文字传递给采用非常量指针的函数是非法的。