明确几点
一 函数三要素 名称 参数 返回值
二 名称就是函数空间的地址指向
参数在编译的时间就会定义好参数占用空间
返回值 最近源码看了看感觉 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字节 ) 每个都写一个?
为了减少这种不必要的麻
|