C语言 重构 函数内存和传值等问题 -- 以及看源码的一些念念碎 和为啥要用(void*)

明确几点

一 函数三要素  名称 参数 返回值
二 名称就是函数空间的地址指向  
	参数在编译的时间就会定义好参数占用空间 
	返回值 最近源码看了看感觉 0 或者其他的返回值代表正确或者不同的好很多

值传递和地址传递

那个值传递导致交换失败的案例导致最后要用地址传递的例子就不写了。。。。。

说一下 看源码时候 形参知识点

首先形参所占用的空间是提前定义好的 多大就看前面的类型
形参不等于实参 只是单纯的拷贝 传递值拷贝值 传递地址拷贝地址  但是要改变上层(调用函数)的数值必须地址传递
值传递

简单说就是 主要是保护 上层空间不想让下层空间修改数值 只能读(拷贝)不能改

地址传递

1 为了改变
2 如果直接值传递拷贝空间太大需要传递地址来节约内存

由于地址传递本来就有两种目的所以问题就出在怎么才能从源码的形参中看出函数的目的?

	1:我就看看 不修改 用用不改变  这种很好发现  比如
	主要用到的是 const  比如  
	void copy (int &a ,const int &b) 这就是典型的 a 可以修改b 不能修改然后带着这个逻辑看源码。

	
	
	2 空间传递(地址就是首地址 )而且改变   
		又分为两种: 字符空间(char *p  和 const char * p) 和 非字符空间(不是 char *p  和 const char * p   比如:unsigned  char *p)
		首先字符空间如果需要修改很简单:
		因为字符有其固定的结束标志0x00(8B)   要遍历很简单   比如传递过来是 
		void add(char *p )
		{ 
				int i = 0;
				while(p[i])
				{
				//操作即可
				i++
				}
		}
		如果非字符空间呢? 他是没有固定的结束标志的? 那就是我们常见的传入其长度就可以
		这种源码中很常见  日常也很常见比如  
		void add (unsigned char  *p, int num){
		int i   = 0;
		for(i<num;i++)
		{
		//操作
		}
		}
		在想一个问题    前面说过定义指针时候  就确定了 指针的存取方式  那这个函数 我岂不是不能传 int *p (int 存取是4字节 ) 每个都写一个?  
		为了减少这种不必要的麻烦 C语言定义了 (void*)  不规定类型  赋值是什么就是什么 这样 函数就可以写为 void add((void*)p,int size) 就可以通用了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值