C语言函数指针和字符串

  • Post category:C

C语言函数指针和字符串结合起来使用时,可以方便地进行动态调用函数、函数参数传递、回调函数等操作。

函数指针

函数指针可以理解为一个指向函数的指针变量,它可以用来动态调用函数、实现回调函数等功能。函数指针定义的一般形式如下:

返回类型 (*指针变量名)(参数列表);

其中,括号中的“*”表示指针类型,指向函数的指针变量名可以自己定义。例如,我们定义一个函数指针变量ptr,指向一个参数为int类型,返回值为int类型的函数,可以这样写:

int (*ptr)(int);

如果我们有一个函数func,符合上述要求,那么可以将函数地址赋给函数指针变量ptr:

int func(int x)
{
    // ...
}

int main()
{
    int (*ptr)(int);
    ptr = func;
    int result = ptr(10);   // 动态调用函数
    // ...
}

字符串处理

在C语言中,字符串是以\0结尾的字符数组,可以通过数组下标来访问字符串中的每一个字符。处理字符串时,经常会涉及到以下库函数:

  • strcpy:拷贝字符串
  • strcat:连接字符串
  • strlen:获取字符串长度
  • strcmp:比较字符串

例如,我们定义了一个字符串str,需要将其复制到另一个字符串str1中,可以使用strcpy函数:

char str[] = "hello world";
char str1[20];
strcpy(str1, str);

需要注意的是,目标字符串要有足够的空间来存储源字符串。

函数指针与字符串结合使用

在使用函数指针时,若需要把字符串作为参数传递给函数,可以将字符串看作指向字符数组首元素的指针,以及字符串长度作为额外的参数传递给函数。

void traverse(char *str, int len)
{
    // 遍历字符串并输出每个字符
    for (int i = 0; i < len; i++)
    {
        printf("%c ", *(str + i));
    }
}

int main()
{
    char str[] = "hello world";
    int len = strlen(str);
    // 定义函数指针,指向traverse函数
    void (*ptr)(char *, int) = &traverse;
    // 通过函数指针调用traverse函数
    (*ptr)(str, len);
    return 0;
}

此外,函数指针与字符串结合使用还可以实现回调函数的功能,可以参考以下示例:

void traverse(char *str, int len, void (*func)(char c))
{
    for (int i = 0; i < len; i++)
    {
        (*func)(*(str + i));    // 调用回调函数
    }
}

void print_char(char c)
{
    printf("%c ", c);
}

int main()
{
    char str[] = "hello world";
    int len = strlen(str);
    void (*ptr)(char *, int, void (*)()) = &traverse;
    (*ptr)(str, len, &print_char);  // 传递回调函数print_char
    return 0;
}

在上面代码中,traverse函数中传入了一个回调函数func,用来处理遍历到的字符,在main函数中将print_char函数传递给traverse函数作为回调函数。执行后输出为:

h e l l o   w o r l d