值傳遞:
形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被調用函數的角度來說,值傳遞是單向的(實參->形參),參數的值只能傳入,
不能傳出。當函數內部需要修改參數,並且不希望這個改變影響調用者時,採用值傳遞。
指針傳遞:
形參爲指向實參地址的指針,當對形參的指向操作時,就相當於對實參本身進行的操作
指針傳遞的實質:
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作爲被調函數的局部變量處理,
即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成爲了實參的一個副本。值傳遞的特點是被調函數對形式參數的
任何操作都是作爲局部變量進行,不會影響主調函數的實參變量的值。(這裏是在說實參指針本身的地址值不會變)
#include <stdio.h>
void swap(int p1,int p2)
{
int temp;
temp = p1;
p1 = p2;
p2 = temp;
}
int main()
{
int a;
int b;
printf("輸入兩個數字:\n");
scanf("%d%d",&a,&b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
運行結果:
結果顯示 a和b的值沒有交換,這就是值傳遞
值傳遞的特點是被調函數對形式參數的任何操作都是作爲局部變量進行,不會影響主調函數的實參變量的值。
(這裏是在說實參指針本身的地址值不會變)
修改後:
#include <stdio.h>
void swap(int *p1,int *p2) //pi和p2改成了指針變量
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a;
int b;
printf("輸入兩個數字:\n");
scanf("%d%d",&a,&b);
swap(&a,&b); //將a和b的地址傳遞給函數
printf("a=%d,b=%d\n",a,b);
return 0;
}
運行結果:
<img src="https://img-blog.csdn.net/20161104164021340" alt="" />