指针与函数

C语言中,指针与函数之间有着千丝万缕的关系,两者之间的关系也不简单,以下列出指针与函数之间的一些许关系。

一、 传值与传地址

函数调用过程中,数据从实参传递给形参,是把实参的值单向复制到形参中,如果实参给形参传递的是地址值,则称为地址调用,简称为传地址;否则称为值调用,简称为传值

#include <stdio.h>

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(int argc, char** argv)
{
    int x=100, y=200;
    printf("x=%d,y=%d",x,y);
    swap(&x,&y);
    printf("\nx=%d,y=%d", x, y);
    return 0;
}

二、指针作为形参返回多个值

每次函数调用最多只能通过return语句显式地返回一个结果,而在很多问题中可能需要返回多个结果,这就无法完全依靠return语句实现了。此时可以通过指针来实现这一功能。

#include <stdio.h>

void calculate(int a, int b,int *m,int *n)
{
    *m = a + b;      //通过指针返回多个数值
    *n = a - b;
}

int main(int argc, char** argv)
{
    int x=100, y=200;
    int sum, del;
    calculate(x,y,&sum,&del);
    printf("x=%d,    y=%d", x, y);
    printf("\nx+y=%d,   x-y=%d", sum, del);
    return 0;
}

三、返回指针的函数

在C语言中允许一个函数的返回值是一个指针(即地址值),这种返回指针值的函数称为指针(型)函数。

#include <stdio.h>

int *calculate(int *a, int *b)   //定义一个指针型函数
{
    if (*a > *b)
        return a;                    //返回地址值
    else
        return b;
}

int main(int argc, char** argv)
{
    int x=100, y=200;
    int s, del;
    s=*calculate(&x,&y);            //通过*转化为数值赋值给s
    printf("x=%d,    y=%d", x, y);
    printf("\n%d和%d,%d大",x,y,s);
    return 0;
}

四、指向函数的指针

C语言中规定,一个函数的代码总是占用一段连续的内存区,而函数名就是该函数代码内存区的首地址(入口地址)。我们可以把函数的首地址赋值给一个指针变量,使得该指针变量指向这个函数,而后通过指针变量就可以找到并调用这个函数:

#include <stdio.h>

int max(int a, int b)
{
    return a > b ? a : b;
}

int main(int argc, char** argv)
{
    int x, y, max_val;
    int (*p_max)(int a, int b) = max;   //p_max是一个指向函数max的指针变量,该函数的返回值是整型,且有两个整型形参

    printf("请输入两个整数:");
    scanf_s("%d,%d", &x, &y);

    max_val = (*p_max)(x, y);   //相当于调用max(x,y),这里切记不要写成*p_max(x,y),一个是指针函数(后者),一个是指向函数的指针(前者)
    printf("两数中最大值为:%d\n", max_val);

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值