1. 程式人生 > >用指標傳遞引數

用指標傳遞引數

   交換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

       其他情況下陣列名都表示陣列首元素的地址;

                        * *關於在函式中修改指標**

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