用指標傳遞引數
阿新 • • 發佈:2018-11-22
交換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;
}