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;
}