指针:就是地址
&a:获取a的地址 取地址符
*p; //p是一个整型指针变量
*p; //解引用 或者称为 间接访问,访问p所指向的内容
例:输入a,b两个整数,按先后大小输出
- 法一:用指针方法处理
int main()
{
int* p1, * p2, * p, a, b;
printf("请输入a和b:");
scanf_s("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b)
{
p = p1;
p1 = p2;
p2 = p;
}
printf("max=%d,min=%d\n", *p1, *p2);
return 0;
}
- 法二:用指针类型的数据作函数参数
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
请注意交换* p1和* p2的值是如何实现的
以下均是错误演示
void Swap_err1(int a,int b)//错误 没有传指针
{
int tmp = a;
a = b;
b = tmp;
}
由于单向传递的值传递方式,形参值的改变不能使实参值发生改变
void Swap_err2(int *p1,int *p2)//错误 没有解引用
{
int* tmp = p1;
p1 = p2;
p2 = tmp;
}
用指针变量作函数参数时同样遵循单向传递的规则
不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值
//野指针
void Swap_err3(int *p1, int *p2)
{
int* tmp;//没有初始化 随机值
*tmp = *p1;//崩溃点
*p1 = *p2;
*p2 = *tmp;
}
野指针 也称悬挂指针,你不能访问的地址
结论:
在一个函数中能修改一个函数的值有两个条件
1.传指针
2.解引用