OC学习2——C语言特性之函数
1、OC是在C语言的基础上进行扩展的,在OC中直接用C语言进行coding也是可以通过编译的。因此,函数定义的语法格式如下:
函数返回值类型 函数名(形参列表)
{
//由零条或多条可执行性语句组成的函数提
}
2、函数的传递机制:值传递、地址传递。
值传递:将实际的参数值的副本(复制品)传入函数内,参数本身不受函数内对其副本的改变的影响。
地址传递:将实际参数的地址的副本传入函数,函数中对地址对应位置的值进行改变会影响到实际参数的值。
3、内部函数和外部函数:
内部函数:定义函数时用static修饰,该函数只能被当前源文件中的其他函数进行调用,这种函数称为内部函数。内部函数具有更好的内聚性,它可以保证该函数只能在该源文件中被调用,从而可以避免多个源文件中重名函数的冲突问题。
外部函数:定义函数时使用extern修饰,或者不使用任何修饰符修饰,它可以被任何文件中的函数调用,这种函数称为外部函数。一般用于库函数的定义中。
4、局部变量与全局变量:
局部变量:分为函数局部变量和代码块局部变量。C语言并不强制对局部变量赋初始值,在程序员对局部变量赋初始值之前,局部变量的值是不确定的,这是因为每次调用函数的时候都会为该变量重新分配内存,而重新分配的内存中的值是不确定的。
全局变量:也称为外部变量,该源文件中的所有函数都可以使用全局变量。如果局部变量和全局变量同名,则局部变量会覆盖全局变量。全局变量又分为外部全局变量(所有源文件的函数都可以访问的变量,用extern关键字声明或者不声明)和内部全局变量(当前源文件中的所有函数都可以访问的变量,用static关键字声明)。
5、C语言程序运行的内存大致可以分为三个部分:程序区、静态存储区、动态存储区。
静态存储区:静态存储区的变量在程序运行开始时分配内存,直到程序结束才会释放内存,在程序运行过程中,静态存储区的变量总是占据固定的内存,静态存储区总是存放两类变量:全局变量、static修饰的局部变量。
动态存储区:动态存储区的变量所在的存储空间是动态分配的,当程序多次调用同一个函数时,该函数的局部变量(非static修饰的变量)每次都会动态分配内存空间,每次函数结束都会自动释放这些内存空间,这种分配和释放都是动态的。动态存储区主要存放三类数据:函数的形参、非static局部变量、函数执行的现场数据以及返回地址等。
6、C语言中变量的存储类别:
auto:自动存储几只,局部变量默认采取这种存储机制
static:指定将局部变量存放在静态存储区,这样该变量所占的空间爱你的一直保存直到程序退出。
register:指定将该变量存放到寄存器中。
extern:定义外部局部变量。
1 #import <Foundation/Foundation.h>
2
3 //了解auto和static的区别
4 void fac(int n)
5 {
6 auto int a = 1 ;
7 static int b = 1 ;
8 a+= n ;
9 b+= n ;
10 printf("a = %d, b = %d",a, b) ;
11 }
12
13 int main(int argc, char * argv[])
14 {
15 //才用循环调用三次
16 for(int i = 0 ; i < 3 ; i++)
17 {
18 fac(i) ;
19 }
20 }
21
22 /* 输出结果为
23 a = 1, b = 1
24 a = 2, b = 2
25 a = 3, b = 4
26 */
7、预处理是C、OC的特殊命令。在编译器对程序进行编译之前,编译器会对这些预处理进行处理,然后将这些预处理的结果与源程序一起进行编译。
预处理的两个特征:1、预处理命令都必须以#开头;2、预处理通常都位于程序开头部分。
1 //使用#define执行宏定义,#undef取消宏定义
2 #define YES 1
3 #define PI 3.1415926
4
5 #undef YES
6
7 //带参宏定义
8 #define AREA(r) PI*r*r
9
10 // C语言使用#include导入其他源程序
11 // OC语言使用#import导入其他源程序
12
13 //使用#ifdef、#ifndef、#else、#endif执行条件编译
14 #ifdef 宏名称
15 //语句
16 #else
17 //语句
18 #endif
19
20 //使用#if、#elif、#else、#endif 执行条件编译
21 #if 表达式
22 //语句
23 #elif 表达式
24 //语句
25 //可以有多个#elif语句
26 #else
27 //语句
28 #endif
- 独家 | 教你用Scrapy建立你自己的数据集(附视频)
- 浏览器平台:Internet Explorer 8
- ASP.NET MVC 1.0 RC 那些事
- 优化SQLServer——表和分区索引(二)
- 关于UNPIVOT 操作符
- XML 在SQLServer中的使用
- 在asp.net mvc上应用新ASP.NET图表控件
- 自定义Unity对象生命周期管理集成ADO.NET Entity Framework
- Mono运行于IPhone之上
- Apache Hadoop入门
- 参数化(三):参数嗅探
- 什么是内存数据库以及它如何有效保存数据
- DATETIME类型和BIGINT 类型互相转换
- 参数化(二):执行查询的方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法