在内存空间中, 

  1. 单位大小的数据 叫 数值 . 比如 int a; char b; ...

  2. 由这些单位数据组合起来的内存, 称作 空间. 比如: 各种数组char/int a[10]; 结构体...  空间以数组为例.又分为:

      2.1 字符空间 

      2.2 非字符空间

对于 数值 做参数有两种方法:

值传递: 只是拷贝数据副本, 不会对原有数据进行篡改. (保护数据)

地址传递:. 传递数值的地址, 目的在于对原有的数据进行修改 . (灵活使用)

对于 空间 来说, 设计参数的时候,只用地址传递. 因为值传递的副本拷贝是非常缓慢而且浪费内存空间的操作 .

  再次提一下 字符空间 和 非字符空间 的区别.

  内存分为字符空间和非字符空间 .

    字符空间 只有一种情况,那就是 由 char 组成,能转换成字符的内存空间.

       唯一表达:  char buf[10] --> char *buf

    非字符空间 纯粹只是记录由0 1 组成的数据,由 char int float ...

    最特殊的就char 大小的数组.

    假设有一个char大小的非字符空间用来保存buf,所以定义成 char buf[10] ,,,但是,这不是和 字符空间的表达形式冲突了

    所以定义非字符空间 中 char 的表达形式:

      unsigned char buf[10]

字符空间与非字符空间小结:

  数据定义 形参设计
字符空间(唯一) char buf [10] char *buf
非字符空间 unsigned char buf[10]; int buf[10]; ... unsigned char *buf; int *buf;... -->(void *)

空间传递:

  1. 下级函数只是读取空间的内容,并不修改空间里面的数据: 

    const char *buf 传达的是对数据进行一种保护,数据由上层传递到下层函数只是只读,并不修改 .

  2. 子函数反向修改上层空间里面的内容

    2.1 字符空间

    2.2 非字符空间

        字符空间和非字符空间结束标志不同
        空间一定要有 首地址 和 结束标志
        结束标志:
    字符空间 0x00-->'\0'
          非字符空间: 不能用 0 来作为结束符标志, 用数字来表示空间大小
字符空间操作模板:
func(char *p){
  while(*p != ){
    *p = xx;
    yy = *p;
    p++;
}
}
例子:strlen
int strlen( const char *str ){  //不希望改变传进来的空间,所以加上const

    int len;
//1. 错误处理
if( str == NULL ){
return -;
} //2.操作
while( *str != ){
len++;
str++;
}
return len;
}
   非字符空间: unsidned char *p;    int *p; short *p;   struct abc *p   -->不会当成字符串
      结束标志:数量
 
非字符空间操作模板:
void func( unsigned char *p, int len){  //首地址和 长度共同限制

    int i;
for(i = ; i<len; i++){
//xxxxx
}
}

    但是这样子存在数据匹配的问题,(略)

  所以,我们在想有没有一种表达形式来表示所有非字符空间呢,于是引进了 空指针 void *

于是:

字符空间 形参特征式 char *buf

非字符空间 形参特征式 void *buf

  

  [  看见 char *buf 就想到这是字符空间,带结束符

    看见 void *buf 就想起这是非字符空间,靠数量规定结束符  ]

  
    void func (void *p){

        //强转
unsigned char *tmp = (unsigned char *)p; //使用
tmp[] = xx;
*(tmp+)
= xx;
}

最后 int *p 和 void *p的区别:

因为我们在传递一个单一数值的时候有值传递和地址传递

int a 的地址传递的形参就是 int *a;

但是空指针的前身 非字符空间里面也有一种指针 int *buf

所以,在参数设计的时候,

对于  

unsigned char *a; int *a;  float *a ...等等,表达的是非字符串的 单一数据 的地址传递

而它们升级后的空间传递 均用 void * 来中转.

C语言函数篇(三)函数参数高级设计的更多相关文章

  1. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  2. sybase下convert函数第三个参数(时间格式)

    convert(varchar(10),字段名,转换格式) 比如:1.select user_id,convert(varchar(10),dayts,11) as dates from tb_use ...

  3. python函数知识三 函数名的使用、格式化、递归

    12.函数名的使用 函数是第一类对象 函数名可以当做值被赋值给变量 def func(): print(1) return a = func print(func) print(a) a() 函数名可 ...

  4. SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

    数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print  可以再消息栏里打印东西 数学函数 ceiling()  取上限   不在乎小数点后面有多大,直接忽略 floor()   ...

  5. SQl Server 函数篇 聚合函数

    说一下数据库中的聚合函数 函数使用必须加小括号(), 5种聚合函数: 1.max最大值   select max(price) from car where code='c024'   --取这一列中 ...

  6. C语言函数篇(二)函数参数基础设计

    形参实现一种数据传入的接口 ,由 实参 拷贝给 形参. 拷贝!!!!!!!!!!! 例1: void func(int tmp){ //意图是实现传进来的参数 +1 tmp++; } int mian ...

  7. Socket编程(C语言实现):socket()函数英文翻译

    最近开始研究使用Socket API来网络编程,想着把自己的感想.感悟写下来.我发现在编程之外还有不少概念性的东西要学习.我觉得应该有以下几点吧: 1.得了解下计算机网络的基本概念,如OSI的7层模型 ...

  8. JavaScript面向对象编程指南(三) 函数

    第3章 函数 3.1 什么是函数 函数:本质是一种代码的分组形式.函数的声明如下: <script type="text/javascript"> /*函数的声明组成: ...

  9. python开发第四篇:函数(1)

    函数 阅读目录 一 函数知识体系 二 函数基础 三 函数对象.函数嵌套.名称空间与作用域.装饰器 四 迭代器.生成器.面向过程编程 五 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数 ...

随机推荐

  1. 4.JavaScript

    1.简介 JavaScript 是一种轻量级的编程语言,是一种动态类型.弱类型.基于原型的脚本语言. JavaScript,通常缩写为JS,是一种高级的,解释执行的编程语言.JavaScript是一门 ...

  2. 移动端absolute元素居中

    <div class="db"> <div class="dm"></div> </div> .db{ widt ...

  3. REP-0118:can not create temporary file(无法创建临时文件)

    解决办法: 查看一下注册表里面的reports_tmp 的路径 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_DevSuiteHome1 .是不 ...

  4. BarCode条形码生成库

    一.Barcode生成条形码的类库 二.示例 新建mvc空项目,添加Nuget引用 主要代码 // // GET: /Home/ public FileContentResult Index() { ...

  5. Azure 进阶攻略 | 上云后的系统,「门禁」制度又该如何实现?

    各位办公室白领们,不妨回想一下自己每天去公司上班时的一些细节. 为避免「闲杂人等」进入工作场所,我们需要证明自己是这家公司的员工才能进入,对吧!所有员工,无论所属部门或职位,都必须先证明自己身份,例如 ...

  6. 2017年10月31日结束Outlook 2007与Office 365的连接

    2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用R ...

  7. 如何创建一个新浪微博应用以及获得Access token

    前提条件是您得先有一个新浪微博帐号. 打开网页http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 点击新手引导->开发者页面: 会自动跳转到页面:http ...

  8. 使用Python命令创建jenkins的job

    目的:通过调用jenkins的命令,动态创建jenkins的job 如何使用,使用Python的脚本,更多API可以进入到官网去查看,http://jenkinsapi.readthedocs.io/ ...

  9. 【CCPC-Wannafly Winter Camp Day4 (Div1) F】小小马(分类讨论)

    点此看题面 大致题意: 给你一张\(n*m\)的棋盘,问你一匹马在两个点中是否存在一条经过黑白格子数目相等的路径. 简化题目 首先,我们来简化一下题目. 考虑到马每次走的时候,所经过的格子的颜色必然发 ...

  10. Poj(2236),简单并查集

    题目链接:http://poj.org/problem?id=2236 思路很简单,傻逼的我输出写成了FALL,然后遍历的时候for循环写错了,还好很快我就Debug出来了. #include < ...