您的位置:首页 > 其它

关于函数参数的一点总结

2012-10-31 22:05 183 查看
先理解一个东西:

int n;
n = 3;
printf("%d", n);
printf(“%d”,&n);


 

看一下n在内存中的表现



int n;申请一段内存,这是n就代表一段sizeof(int)个字节的内存,“12FFCC”表示这段内存的首地址,也就是第一个字节的地址(因为内存单元是以字节为单位的),第一个输出就是输出这段内存中存储的数据,就是3,&是取址符,第二个输出就表示输出n这段内存的首地址,所以输出为“12FFCC”。

理解了上面的,现在来看函数的参数。

先记住一点:函数的参数永远是值传递,不管你传的是int,float,int*,还是struct node *类型的值。

某一个函数在执行的时候,该函数就得到一个所传参数的复制品;那么在这个函数内部,对这个复制品的任何改变都不会影响实际这个参数本身。

现在就来举例说明:

#include<stdio.h>
void Fun(int m){
m = 4;
printf("%d", m);
}
main(){
int n;
n = 3;
printf("%d", n);
Fun(n);
printf("%d", n);

}


 

main函数两个输出都是3,可以理解吗?函数Fun执行的时候,n就产生了一个复制品,(脑子里要想着上面那个n的内存图),执行
m=4;语句后这个复制品里面的数据就变成了4;就是说此时Fun里面的那个输出为4.可是你复制品里面的值改变了,实际的值并没有改变,所以main函数里的第二个输出仍为3.


#include<stdio.h>
void Fun(int &m){
m = 4;
printf("%d", m);
}
main(){
int n;
n = 3;
printf("%d", n);
Fun(n);
printf("%d", n);

}


 

这个函数执行后你会发现,main函数里的第二个输出为4,可是不是说是复制品吗,怎么实际的也改变了,注意一下,Fun函数里的参数类型,它是int
&类型,也就是说传的是参数的引用(就是地址),这时候这个复制品就是这个地址就是“12FFCC”那么照上面说的,对这个地址的改变不会影响实际,也就是说你在函数里面把&m改变了(这个好像实现不了,但是是这样理解的),实际的不会变,可是为什么输出的n改变了,你好好看一下,在函数里我们是对&m进行改变吗?不是,是对m,m是什么?它是一段int型内存,我们是把地址复制了,可是这个地址“12FFCC”所指向的内存是不变的,不管你是复制品还是实际的,你这个确切的地址在内存中都是特定的一段,也就是说我们函数里面对n的改变操作是在同一段内存进行的(这是最关键的),所有这个改变有效。


#include<stdio.h>
void Fun(int *m){
*m = 4;
printf("%d", *m);
}
main(){
int n;
n = 3;
printf("%d", n);
Fun(&n);
printf("%d", n);

}


 

这个程序和上面的程序产生的效果是一样的,这时,函数的参数是int指针类型,也就是传的是一个地址,(这和上面有区别,上面传的是n函数获取的是n的引用(地址),可是这个程序要传指针(地址))所有传&n,再看Fun函数里面,里面改变的是*m,*m是这个地址指向的一段int型内存,复制品是&n,他是地址,不管是复制品还是实际的,它们指向同一段内存,所有改变有效,是不是和上面一样的啊,好,紧接着下面这个程序:

#include<stdio.h>
void Fun(int *m){
int t = 4;
m = &t;
printf("%d", m);
}
main(){
int n;
n = 3;
printf("%d", &n);
Fun(&n);
printf("%d", &n);

}


 

这个程序的Fun函数里面把m的值改变了,m是什么,是地址,是&n,它是个复制品,所以对它的改变无效,所有main函数里面的两个输出不变。

下面是运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: