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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

JAVA中基本数据类型和引用数据类型特点

特点: 一、从概念方面来说 基本数据类型:变量名指向具体的数值 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值 二、从内存构建方面来说...

2838
来自专栏深度学习与计算机视觉

C++ 动态捕获整型数列

假设有这样一个要求,输入两列数字,第一行是数组中数字的个数,第二行数数组中的数字,中间以空格隔开,我们可以写出这样的一段代码: int num; ...

1839
来自专栏aCloudDeveloper

经典排序之 归并排序

Author: bakari  Date: 2012.7.30 排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之...

1959
来自专栏Python数据科学

Python 内建函数大全

Python 解释器内置了许多函数和类型,列表如下(按字母排序)(省略了几个我没用过或者不常用的)。

2523
来自专栏liulun

Nim教程【八】

有序类型 值连续的枚举类型、整型、字符类型、布尔类型(还有这些类型的变种), 都可以称之为有序类型,Nim为有序类型提供了一系列特殊的方法 方法签名 方法...

2076
来自专栏专注数据中心高性能网络技术研发

[C++]C++面试知识总结

1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: ? 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS...

3254
来自专栏北京马哥教育

python模块之re正则表达式详解

正则表达式是一种小型的、高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分。在python中,主要通过re模块来实现。这篇文...

4069
来自专栏C/C++基础

C/C++结构体初始化与赋值

结构体是常用的自定义构造类型,是一种很常见的数据打包方法。结构体对象的初始化有多种方式,分为指定初始化、顺序初始化、构造函数初始化。假如有如下结构体。

1872
来自专栏不想当开发的产品不是好测试

nodejs 语法学习(持续更新)

合并objects var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 }; var obj = Ob...

23910
来自专栏Android机器圈

静态变量和实例变量的区别(配图解释专业术语,通俗易懂)

1:首先在语法定义上区别:静态变量前面要加static,实例变量不用 2:在程序运行时:实例变量输入对象的属性,必须创建了实例对象(如 new)才会被分配空间...

34613

扫码关注云+社区

领取腾讯云代金券