C语言指针(2):指针的应用

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
请按任意键继续. . .
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值