C语言中,指针与函数之间有着千丝万缕的关系,两者之间的关系也不简单,以下列出指针与函数之间的一些许关系。
一、 传值与传地址函数调用过程中,数据从实参传递给形参,是把实参的值单向复制到形参中,如果实参给形参传递的是地址值,则称为地址调用,简称为传地址;否则称为值调用,简称为传值。
#include二、指针作为形参返回多个值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三、返回指针的函数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四、指向函数的指针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语言中规定,一个函数的代码总是占用一段连续的内存区,而函数名就是该函数代码内存区的首地址(入口地址)。我们可以把函数的首地址赋值给一个指针变量,使得该指针变量指向这个函数,而后通过指针变量就可以找到并调用这个函数:
#includeint 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("两数中最大值为:%dn", max_val); return 0; }



