函数指针
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++ 中,将字符串文字传递给采用非常量指针的函数是非法的。
我有一个简单的函数指针测试代码:
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++ 中,将字符串文字传递给采用非常量指针的函数是非法的。