函数指针

Function pointer

我有一个简单的函数指针测试代码:

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*) 接受一个 指向字符串 的指针作为参数。但是我的代码是通过Function Pointerptr("world")调用这个函数的,其中我直接将字符串"world"传递给函数,而不是指针字符串。为什么有效?

在 C 中,字符串文字的类型为 char []。将字符串文字传递给函数意味着您将指针传递给字符串的第一个 char * 类型的元素。函数调用

ptr("world"); 

等同于

char name[] = "world"; 
ptr(name);          // Name decays to pointer to first character of the string literal.  

应该注意的是,字符串文字是不可修改的,因此 ptr("world"); 中的 "world" 但对于 char 数组并非如此。

在 C++ 中,字符串文字的类型为 const char []。这意味着函数 ptr 必须有一个类型为 const char * 的参数,而不是 char *。 (const char [] 会衰减到 const char *)。

the function PrintHello(char*) accepts a pointer to string

不,不是。它接受指向 char.

的指针

But my code calls this function through Function Pointer

WRT 参数的传递完全无关紧要。

I directly passed the string "world" to the function

你没有。您传递了一个文字,这与传递指向第一个元素的指针相同(C 中的char*,C++ 中的const char*)。

Why it works?

如前所述,通过函数指针调用函数这一事实并不重要。所以它像普通电话一样工作。也就是说,在 C++ 中,将字符串文字传递给采用非常量指针的函数是非法的。