揭露函數所傳遞參數的本來面目

傳遞函數時的會發生參數拷貝,新建地址,但是數組是除外的。

例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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章