函数指针
Function pointer
我有一个简单的函数指针测试代码:
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++将字符串文本传递给采用非常量指针的函数是非法的。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址