函数指针

Function pointer

本文关键字:指针 函数      更新时间:2023-10-16

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

void PrintHello(char *name)
{
    printf("Hello %sn", 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"传递给函数,而不是指向字符串的指针。为什么有效?

在 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 *(。

函数 PrintHello(char*( 接受指向字符串的指针

不,它没有。它接受指向char 的指针。

但是我的代码通过函数指针调用此函数

WRT参数的通过根本不重要。

我直接将字符串"world"传递给函数

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

为什么有效?

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