三、函数应用实例
1、将输入的数字从小到大排列
#include <stdio.h>
#include <stdlib.h>
int swap(int *num1, int *num2)
{
int n;
n = *num1;
*num1 = *num2;
*num2 = n;
}
void main(int argc, char *argv[])
{
int a, b;
int *num1, *num2;
printf("请输入两个数字,用空格隔开:");
scanf("%d %d", &a, &b);
num1 = &a;
num2 = &b;
if (a>b) swap(num1, num2);
printf("%d, %d\n", a, b);
}
num1, num2:指针变量名,用来保存变量地址(指针)
*num1, *num2:是取指针变量所指指针地址(变量地址)的值,相当于间接取a,b变量的值
a, b:变量名
&a, &b:变量地址
形参num1和num2是两个指针变量,swap函数将两个指针变量所指的指针地址的值交换,就相当于交换了a,b两个变量的值,我靠,可以直接操作内存原来这么强大。
2、输出10位之后的字符串
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[]){
static char string[] = {"this is a book"}; //初始化字符串数组变量
char *ps = string; //将字符串数组的首地址赋值给ps指针变量
ps = ps + 10; //将指针地址向后偏移10
printf("%s\n", ps); //输出10位之后的字符串
}
3、函数指针变量形式调用函数
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b){
if(a>b)return a;
else return b;
}
void main(){
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
4、字符串数组的指针运算
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int* p;
p = numbers;
*p = 10; //设置numbers[0] = 10;
p++; //p位移1,相当于 p = &numbers[1]
*p = 20;
p = &numbers[2];
*p = 30;
p = numbers + 3; // 相当于 p = &numbers[3]
*p = 40;
*(p+1) = 50; //相当于 p = &number[4] 并且赋值 50
for (int i=0; i<5; i++){
cout << numbers[i] << endl;
}
}
从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:
- 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义 pmax为函数指针变量。
- 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;
- 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);
- 调用函数的一般形式为:(*指针变量名) (实参表)
使用函数指针变量还应注意以下两点:
- 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
- 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。