1. 指针变量作为函数参数
#include<stdio.h>
#include<Windows.h>
void swap(int * x, int * y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp; //交换*x和*y所指向的变量的值
}
int main()
{
int a = 1, b = 2;
printf("交换前a=%d,b=%d\n", a, b);
swap(&a, &b); //取a和b的地址
printf("交换后a=%d,b=%d\n", a, b);
system("pause");
return 0;
}
运行结果:
交换前a=1,b=2
交换后a=2,b=1
请按任意键继续. . .
2. 通过指针引用数组
可以用一个指针变量指向一个数组元素。例如:
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int * p = &a[0];
当然定义时也可写成:
int * p = a;
#include<stdio.h>
#include<Windows.h>
int main()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]); //数组元素用数组名和下标表示
}
printf("\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", * (a+i)); //通过数组名和元素序列找到该元素的值
}
printf("\n");
system("pause");
return 0;
}
运行结果:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
请按任意键继续. . .
注意:
由于“ ++ ”和 “ * ”同优先级,结合方向自右向左,因此 *p++等价于 *(p++)
3. 指向函数的指针
如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用该函数,形式如下:
int (*p)(int, int);
定义p是一个指向函数的指针变量,它可以指向函数函数返回值类型为 int 且有两个 int 类型参数的函数。
#include<stdio.h>
#include<Windows.h>
int max(int x, int y)
{
return x > y ? x : y ;
}
int main()
{
int a = 2, b = 3, c;
int(*p)(int, int); //定义指向函数的指针变量
p = max;
c = (*p)(a, b); //通过指针变量调用函数
printf("a=%d, b=%d, max=%d\n", a, b, c);
system("pause");
return 0;
}
运行结果:
a=2, b=3, max=3
请按任意键继续. . .
4. 返回指针值的函数
一个函数可以返回一个整形值、字符值、实型值等,也可返回指针类型的数据,即返回一个地址。返回指针类型的函数的形式如下:
类型名 * 函数名 (参数列表)
#include<stdio.h>
#include<Windows.h>
float * search(float (*p)[4]) //定义函数,形参p是指向一维数组的指针变量
{
float *p1 = NULL;
for (int i=0; i < 4; i++)
{
if (*(*p + i) < 60) p1 = *p; //如果有不合格课程,使p1指向score[i][0]
}
return p1;
}
int main()
{
float score[][4] = { {60, 70, 80, 90},{56, 89, 67, 88},{34, 78, 90, 66} };
float *p;
for (int i = 0; i < 3; i++)
{
p = search(score + i); //调用search函数,如果有不及格返回score[i][0]的地址,否则返回NULL
if (p == *(score + i)) //如果返回的是score[i][0]的地址,表示p的值不是NULL
{
printf("No.%d score:", i);
for (int j = 0; j < 4; j++)
printf("%5.2f ", *(p + j)); //输出score[i][0]~score[i][3]的值
printf("\n");
}
}
system("pause");
return 0;
}
运行结果:
No.1 score:56.00 89.00 67.00 88.00
No.2 score:34.00 78.00 90.00 66.00
请按任意键继续. . .