关于函数参数的一点总结
2012-10-31 22:05
183 查看
先理解一个东西:
看一下n在内存中的表现
int n;申请一段内存,这是n就代表一段sizeof(int)个字节的内存,“12FFCC”表示这段内存的首地址,也就是第一个字节的地址(因为内存单元是以字节为单位的),第一个输出就是输出这段内存中存储的数据,就是3,&是取址符,第二个输出就表示输出n这段内存的首地址,所以输出为“12FFCC”。
理解了上面的,现在来看函数的参数。
先记住一点:函数的参数永远是值传递,不管你传的是int,float,int*,还是struct node *类型的值。
某一个函数在执行的时候,该函数就得到一个所传参数的复制品;那么在这个函数内部,对这个复制品的任何改变都不会影响实际这个参数本身。
现在就来举例说明:
main函数两个输出都是3,可以理解吗?函数Fun执行的时候,n就产生了一个复制品,(脑子里要想着上面那个n的内存图),执行
m=4;语句后这个复制品里面的数据就变成了4;就是说此时Fun里面的那个输出为4.可是你复制品里面的值改变了,实际的值并没有改变,所以main函数里的第二个输出仍为3.
这个函数执行后你会发现,main函数里的第二个输出为4,可是不是说是复制品吗,怎么实际的也改变了,注意一下,Fun函数里的参数类型,它是int
&类型,也就是说传的是参数的引用(就是地址),这时候这个复制品就是这个地址就是“12FFCC”那么照上面说的,对这个地址的改变不会影响实际,也就是说你在函数里面把&m改变了(这个好像实现不了,但是是这样理解的),实际的不会变,可是为什么输出的n改变了,你好好看一下,在函数里我们是对&m进行改变吗?不是,是对m,m是什么?它是一段int型内存,我们是把地址复制了,可是这个地址“12FFCC”所指向的内存是不变的,不管你是复制品还是实际的,你这个确切的地址在内存中都是特定的一段,也就是说我们函数里面对n的改变操作是在同一段内存进行的(这是最关键的),所有这个改变有效。
这个程序和上面的程序产生的效果是一样的,这时,函数的参数是int指针类型,也就是传的是一个地址,(这和上面有区别,上面传的是n函数获取的是n的引用(地址),可是这个程序要传指针(地址))所有传&n,再看Fun函数里面,里面改变的是*m,*m是这个地址指向的一段int型内存,复制品是&n,他是地址,不管是复制品还是实际的,它们指向同一段内存,所有改变有效,是不是和上面一样的啊,好,紧接着下面这个程序:
这个程序的Fun函数里面把m的值改变了,m是什么,是地址,是&n,它是个复制品,所以对它的改变无效,所有main函数里面的两个输出不变。
下面是运行结果:
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函数里面的两个输出不变。
下面是运行结果:
相关文章推荐
- 二级指针作为函数参数传递初始化的一点总结
- JS中关于把函数作为另一函数的参数的几点小总结
- 关于窗体(Windows Form)的CreateParams(属性或参数)的一点总结
- JS中关于把函数作为另一函数的参数的几点小总结
- 关于C语言可变参数函数的一些研究和总结
- 菜鸟编程 关于函数的一点总结
- 关于qsort第四个参数,函数指针作参数的一点思考
- JS中关于把函数作为另一函数的参数的几点小总结
- 关于窗体(Windows Form)的CreateParams(属性或参数)的一点总结!
- JS中关于把函数作为另一函数的参数的几点小总结
- 二级指针作为函数参数传递初始化的一点总结
- 关于函数指针的一点总结
- 关于PCA算法的一点学习总结
- 关于ASP.net编译方式的一点总结。
- C++中关于将fstream对象作为函数参数传递相关问题说明
- 关于C语言中函数调用和参数传递机制的探讨(二 .传递一个参数)
- 关于嵌入式系统学习的一点经验总结
- 关于C中函数传参的一点理解
- python 关于join 函数需要注意的一点