傳遞函數時的會發生參數拷貝,新建地址,但是數組是除外的。
例1;把兩個數由小到大輸出
我們用兩種不同的方式來驗證我所說的機制。
方式一;直接傳。(不會發生交換)
#include<stdio.h>
void change(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
printf("change:a=%d %p\n,b=%d %p\n", a, &a, b, &b);
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (b>a)
{
change(a, b);
}
printf("main:a=%d %p\n,b=%d %p\n", a, &a, b, &b);
}
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/B1/wKiom1YmSaeATatnAABOfuOMCh8100.jpg" title="QQ截圖20151020220102.png" alt="wKiom1YmSaeATatnAABOfuOMCh8100.jpg" />我們可以看出兩個數傳遞過去後地址發生了變化,在函數中完成了交換但本身並不會發生 變化。
方式二,傳地址(會發生交換)
#include<stdio.h>
void change(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
printf("change:a=%d %p\n,b=%d %p\n", *a, &(*a), *b, &(*b));
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (b>a)
{
change(&a, &b);
}
printf("main:a=%d %p\n,b=%d %p\n", a, &a, b, &b);
}
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/AE/wKioL1YmSqqyE4-yAABbofmkM5Q003.jpg" title="QQ截圖20151020220545.png" alt="wKioL1YmSqqyE4-yAABbofmkM5Q003.jpg" />我們可以看出此時傳遞過去的是地址,所以發生了改變。
本文出自 “痕跡” 博客,請務必保留此出處http://wpfbcr.blog.51cto.com/10696766/1704695