关于函数参数的一点总结

先理解一个东西:

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


 

看一下n在内存中的表现

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

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

先记住一点:函数的参数永远是值传递,不管你传的是intfloatint*,还是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进行改变吗?不是,是对mm是什么?它是一段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函数里面的两个输出不变。

下面是运行结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值