用指针传递参数

   交换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;

	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

                                                            。。。。。。。。。。。。。

                                                            。。。。。。。。。。。。。

注:

    1.子函数的改变能影响到父函数,一定要使用指针和解引用,两者缺一不可;

    2.NULL 空指针 唯一一个标识当前指针是一个无效指针;

    3.数组名arr表示整个数组,只在如下两种情况

       (1).在定义数组的函数中,求sizeof

       (2).在定义数组的函数中,&arr+1

扫描二维码关注公众号,回复: 4184504 查看本文章

       其他情况下数组名都表示数组首元素的地址;

                        * *关于在函数中修改指针**

#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;
}

猜你喜欢

转载自blog.csdn.net/zkk258369/article/details/83239883