引用指针变量
指针变量里面只能存放地址(指针)
例题:输入两个整数,按先大后小的顺序输出
#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;
}