交换a,b的值:
#include<stdio.h>
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
//a=a+b;
//b=a-b;
//a=a-b;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n", a, b);
Swap(10, 20);
printf("%d %d\n", a, b);
return 0;
}
上述代码并未交换a,b的值,因为 Swap函数中的a,b都是局部变量, 他们的修改并未修改主函数中的a,b的值;
为了解决在Swap函数中修改主函数中的参数,我们引入指针变量:
void Swap2(int *p1, int *p2)
{
//p1->a,p2->b
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n", a, b);
Swap2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
看看错误使用指针:
void Swap2(int *p1, int *p2)
{
//p1->a,p2->b
//1.未对指针解引用
//int tmp = p1;
//p1 = p2;
//p2 = tmp;
//2.定义了野指针tmp;我们没有 权限 改写 tmp指针所指向的值
//int *tmp;
//*tmp= *p1;
//*p1 = *p2;
//*p2 = *tmp;
//3.正确使用指针
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
。。。。。。。。。。。。。
。。。。。。。。。。。。。
注:
1.子函数的改变能影响到父函数,一定要使用指针和解引用,两者缺一不可;
2.NULL 空指针 唯一一个标识当前指针是一个无效指针;
3.数组名arr表示整个数组,只在如下两种情况
(1).在定义数组的函数中,求sizeof
(2).在定义数组的函数中,&arr+1
其他情况下数组名都表示数组首元素的地址;
* *关于在函数中修改指针**
#include <stdio.h>
void Fun1(int *p)
{
p = NULL;
}
void Fun2(int **p)
{
*p = NULL;
}
int main()
{
int a = 10;
int *p = &a;
//p = NULL;
//printf("%d\n", *p);
//输出空指针指向的值使得程序崩溃
//调用一个函数 希望程序也崩溃,如Fun1(),
// Fun1(p);
// printf("%d\n", *p);
//但调用Fun1()并未达到预期。
// 1、为什么不崩溃,2、如何改
// 答:原因是要在函数中修改一个指针的值,要给函数传递指针的指针
//修改如下:
Fun2(&p);
printf("%d\n", *p);
return 0;
}