关于C函数原型char *strinv(const char *s)中*strinv的疑问
理解C函数原型
char *strinv(const char *s)中的返回值部分 嘿,咱们把这个原型拆解开,你就能搞清楚疑惑点了:
首先,先明确这个原型的结构:
char *是函数的返回值类型,表示strinv函数执行完成后,会返回一个指向char类型数据的指针。strinv是函数的名字,(const char *s)是它接收的参数(一个指向const char的指针)。
接下来直接解答你的两个疑问:
这不是调用时自动解引用
当你调用strinv函数时,函数会返回一个指针值,你需要自己决定要不要解引用它——不会自动帮你做这件事。举个例子:
// 调用函数,拿到返回的指针 char *reversed_str = strinv("hello"); // 如果要取指针指向的第一个字符,需要手动解引用 char first_char = *reversed_str; // 而用printf的%s格式符时,是printf内部会自动处理指针,去读取它指向的字符串内容 printf("%s\n", reversed_str);
这也不是把函数定义为指针
如果要定义一个函数指针(指向函数的指针),写法是完全不同的,需要把*函数名用括号括起来,比如:
// 这才是函数指针:指向一个接收const char*参数、返回char*的函数 char (*strinv_ptr)(const char *s); // 可以把strinv函数的地址赋值给它 strinv_ptr = strinv;
而原原型里的*是属于返回值类型的,和函数名strinv没有绑定,所以它只是表示函数返回一个char指针,不是函数本身是指针。
为了更直观,给你一个strinv函数的简单实现示例(反转字符串):
#include <stdlib.h> #include <string.h> char *strinv(const char *s) { if (s == NULL) return NULL; size_t str_len = strlen(s); // 分配内存存储反转后的字符串(要留'\0'的位置) char *result = malloc(str_len + 1); if (result == NULL) return NULL; // 反转逻辑 for (size_t i = 0; i < str_len; i++) { result[i] = s[str_len - 1 - i]; } result[str_len] = '\0'; // 字符串结束符 return result; // 返回指向新字符串的指针 }
调用这个函数时,你拿到的就是那块堆内存的起始地址(指针),用完记得用free释放哦。
内容的提问来源于stack exchange,提问作者greenbow
相关产品推荐
相关产品推荐

