【发布时间】:2020-10-03 22:33:18
【问题描述】:
我想用一个指向函数的指针来反转一个字符串,该函数执行字符串反转。 我感觉我没有正确掌握使用指向变量或函数的指针的概念,所以如果有人能解释我,我会非常感激,我在这里想错了:
1) 定义一个指向函数的指针:
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
2) 现在我在 main 中定义了一个指针,它与我上面定义的函数相匹配:
int main(void) {
char (*functPtr)(char);
functPtr = &strrev;
3) 现在我定义了我要反转的String,定义一个新的指针,让指针指向String的地址空间。
char str[50] = "Hello, World";
char *pointer[50];
pointer[50] = &str[50];
4)最后我定义了一个新的字符串,并写入函数的结果,它通过指针调用,指针指向函数的指针。
char t[50] = (*functPtr)(pointer[50]);
printf("%s\n", str);
return(0);
}
不幸的是,我收到各种错误消息,例如:
Ü1.c:29:10: error: array initializer must be an initializer list or string literal
char t[50] = (*functPtr)(pointer[50]);
^
Ü1.c:27:5: warning: array index 50 is past the end of the array (which contains 50 elements) [-Warray-bounds]
pointer[50] = &str[50];
^ ~~
Ü1.c:26:5: note: array 'pointer' declared here
char *pointer[50];
^
Ü1.c:29:30: warning: array index 50 is past the end of the array (which contains 50 elements) [-Warray-bounds]
char t[50] = (*functPtr)(pointer[50]);
^ ~~
Ü1.c:26:5: note: array 'pointer' declared here
char *pointer[50];
^
2 warnings and 1 error generated.
【问题讨论】:
-
char (*functPtr)(char);应该是char *(*functPtr)(char *);,因为它需要一个 指针 指向一个字符,而不是一个字符。同样它返回一个指针。 -
char *pointer[50];将是一个包含 50 个指针的数组,您想说一个指向 50 个字符数组的指针。在 C 语言中我们不会那样说。我们只是说“指向 char 的指针”而不说有多少。所以char *pointer;就足够了。 -
char t[50] = (*functPtr)(pointer[50]);在 C 中不正确。您想将funcPtr的结果分配给数组t。但是在这里,您将初始化与分配混合在一起。而且您不能将数组“分配”给 anor=ther 数组。你只能复制它。 -
@PaulOgilvie :非常感谢您对我的错误的解释,我真的很感激!我将最后一行更改为: printf("%s\n", (*functPtr)(pointer));这样我就不必复制数组了。现在我的代码编译了,但是不是“Hello World!”的反向字符串,而是在我的命令行中返回了“��”。我现在是返回指向值而不是值的指针吗?
-
我看到你从你的问题中编辑了第一个错误。 不要不要那样做!这会使您的问题或cmets无法再被理解,因为它们所指的东西已经消失了。我重新编辑了错误。
标签: c pointers reverse c-strings function-definition