外观
05.函数与指针和数组
约 961 字大约 3 分钟
C函数个人随笔
2019-10-01
一、用指针来实现对函数的调用
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
用指针来实现对函数的调用
#include <stdio.h>
返回两个数中较大的一个
int max(int a, int b)
{
return a>b ? a : b;
}
int main()
{
int x, y, maxval;
定义函数指针
int (*pmax)(int, int) = max; 也可以写作int (*pmax)(int a, int b)
printf("Input two numbers:");
scanf("%d %d", &x, &y);
maxval = (*pmax)(x, y);
printf("Max value: %d\n", maxval);
return 0;
}
运行结果:
Input two numbers:10 50
Max value: 50maxval = (*pmax)(x, y);对函数进行了调用。 pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意( )的优先级高于 * ,第一个括号不能省略。
二、指针变量作为函数参数
在 C 语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。
#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp; 临时变量
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 66, b = 99;
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
运行结果:
a = 99, b = 66再来一个例子
三、用数组作函数参数
数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针。
int max(int intArr[], int len)
{
int i, maxValue = intArr[0]; 假设第0个元素是最大值
for(i=1; i<len; i++)
{
if(maxValue < intArr[i])
{
maxValue = intArr[i];
}
}
return maxValue;
}四、指针作为函数返回值
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。
#include <stdio.h>
#include <string.h>
char *strlong(char *str1, char *str2)
{
if(strlen(str1) >= strlen(str2))
{
return str1;
}
else
{
return str2;
}
}
int main()
{
char str1[30], str2[30], *str;
gets(str1);
gets(str2);
str = strlong(str1, str2);
printf("Longer string: %s\n", str);
return 0;
}五、字符串相关的数组和指针

