C语言-返回指针的函数与指向函数的指针

返回指针的函数

指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。

返回指针的函数的一般形式为:类型名 * 函数名(参数列表)

 比如下面这个函数,返回一个指向char类型变量的指针

// 将字符串str中的小写字母变成大写字母,并返回改变后的字符串
// 注意的是:这里的参数要传字符串变量,不能传字符串常量
char * upper(char *str) {
    // 先保留最初的地址。因为等会str指向的位置会变来变去的。
    char *dest = str;
    
    // 如果还不是空字符
    while (*str != '\0') {
        // 如果是小写字母
        if (*str >= 'a' && *str <= 'z') {
            // 变为大写字母。小写和大写字母的ASCII值有个固定的差值
            *str -= 'a' - 'A';
        }
        
        // 遍历下一个字符
        str++;
    }
    
    // 返回字符串
    return dest;
}

 

调用函数:

int main()
{
    // 定义一个字符串变量
    char str[] = "dhu";
    
    // 调用函数
    char *dest = upper(str);
    
    printf("%s", dest);
    return 0;
}

指向函数的指针

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

定义的一般形式:函数的返回值类型 (*指针变量名)(形式参数1, 形式参数2, ...);

 1 #include <stdio.h>
 2 
 3 int sum(int a, int b) {
 4     return a + b;
 5 }
 6 
 7 int main()
 8 {
 9     // 定义一个指针变量p,指向sum函数
10     int (*p)(int a, int b) = sum;
11     // 或者 int (*p)(int, int) = sum;
12     // 或者 int (*p)() = sum;
13     
14     // 利用指针变量p调用函数
15     int result = (*p)(1, 3);
16     // 或者 int result = p(1, 3);
17     
18     printf("%d", result);
19     return 0;
20 }

 首先在第3行定义了一个sum函数,接收2个int类型的参数,返回值类型为int

* 然后在第10行定义了一个指向sum函数的指针变量p。注意p的定义形式:int (*p)(int a, int b),第1个int代表sum函数的返回值是int类型,然后*p是用括号()包住的,后面的int a和int b代表着sum函数的形参,其实完全可以省略。第10行、11行、12行都是可行

* 在第15行,先利用*p取出指向的函数,再传入参数调用函数。也可以采用第16行中的做法,这样就跟调用普通函数没什么区别

最后的输出结果:,毫无意外

 

posted on 2015-03-04 23:15  二狗你变了  阅读(346)  评论(0)    收藏  举报

导航