第八章 指针(第一部分)

引用指针变量
指针变量里面只能存放地址(指针)
例题:输入两个整数,按先大后小的顺序输出

#include<stdio.h>
//第一种传统方法:
//int main() {
//	int a, b;
//	printf("请输入两个整数");
//	scanf_s("%d%d", &a, &b);
//	if (a > b)
//		printf("最大值为:%d,最小值为:%d", a, b);
//	else
//		printf("最大值为:%d,最小值为:%d", b, a);
//	return 0;
//}
//第二种指针变量
int main() {
	int* p, * p1, * p2, a, b;
	printf("请输入两个整数");
	scanf_s("%d%d", &a, &b);
	p1 = &a; //p1指向变量a  
	p2 = &b;
	if (a < b)
	{
		p = p1; p1 = p2; p2 = p;// 可改为p1=&b,p2=&a;直接赋新值
	}
	printf("a=%d,b=%d\n", a, b);
	printf("最大值:%d,最小值:%d\n", *p1, *p2);
	printf("p1地址为->%p\np2地址为->%p\n", &p1, &p2);
	return 0;

}

在这里插入图片描述p1的值原来为&a,后来变成&b
p2的值原来为&b,后来变成&a
在输出p1和p2时就变成输出b和a的值了。
在这里插入图片描述
&为取地址运算符 &p1代表p1的地址
*是 取值运算符 *p代表指针变量p指向的对象
在这里插入图片描述
指针变量作为函数参数
采用指针变量作为函数参数可以改变变量的值,而不能使用改变实参指针的值而使变量的值改变。
temp = p1;
p1 = p2;
p2 = temp;
我们要改变的是指针变量指向的变量的值(a),而不是指针变量(pointer1)的值

#include<stdio.h>
void swap(int* p1, int* p2) //定义swap函数,用于交换
{
	int temp;//temp不能写成*temp,因为*temp指向的变量还没有初始化
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main() {
	void swap(int* p1, int* p2);
	int a, b;
	int* pointer1 = &a;
	int* pointer2 = &b;
	printf("请输入两个整数");
		scanf_s("%d%d", &a, &b);
		printf("a原始值为%d,b的原始值为%d\n", a, b);
		if (a < b)
			swap(pointer1, pointer2);
		printf("最大值为%d,最小值为%d\n", *pointer1, *pointer2);//后面写 a,b是一样的

	printf("a的更新值为%d,b的更新值为%d\n", a,b);
	return 0;

}

函数调用时,实参的值传送给形参
调用函数后,形参p1和实参pointer1指向a,形参p2和实参pointer2 的值指向b
接着执行swap函数,使p1和p2的值进行互换
也就是交换a和 b的值,p1和p2保持不变

用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依旧保留,这样就实现了“通过调用函数使变量的值发生变化”
在这里插入图片描述在这里插入图片描述
函数调用只可以得到一个返回值,使用指针变量做参数,可以得到多个变化了的值。
例如:输入a,b,c 3个整数,按由大到小的顺序输出。

用上面介绍的方法,用3个指针变量指向3个整型变量,然后用swap函数来实现互换3个整型变量的值

#include <iostream>
using namespace std;
int main()
{
	void exchange(int*, int*, int*);  //对exchange函数的声明
	int a, b, c, * p1, * p2, * p3;
	printf("请输入三个整数");
	cin >> a >> b >> c;  //输入3个整数
	p1 = &a; p2 = &b; p3 = &c;  //指向3个整型变量
	exchange(p1, p2, p3);  //交换p1,p2,p3指向的3个整型变量的值
	cout << "三个整数从小到大排序为"<<a << " " << b << " " << c << endl;  //按由大到小的顺序输出3个整数
	printf("改变后的值为%d %d %d", a, b, c);
}

void exchange(int* q1, int* q2, int* q3)
{
	void swap(int*, int*);  //对swap函数的声明
	if (*q1 < *q2) swap(q1, q2);  //调用swap,将q1与q2所指向的变量的值互换
	if (*q1 < *q3) swap(q1, q3);  //调用swap,将q1与q3所指向的变量的值互换
	if (*q2 < *q3) swap(q2, q3);  //调用swap,将q2与q3所指向的变量的值互换
}

void swap(int* pt1, int* pt2)  //将pt1与pt2所指向的变量的值互换
{
	int temp;
	temp = *pt1;
	*pt1 = *pt2;
	*pt2 = temp;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值