您的位置:首页 > 编程语言 > C语言/C++

ios的c语言基础

2016-02-25 16:42 381 查看

iOS的C语言基础

iOS学习按照C- OC - UI/网络 - Swift 顺序;

C语言的运行过程



C语言的运行分为两大部分: 编译和链接

编译:编译阶段会将对应的xx.c源文件(ASCII格式) 编译成目标文件 xx.obj(二进制格式);编译之前先进行预处理, 同时也会进行语法检查;

链接: 将各个.obj文件和C语言库函数组合成一个可执行文件的过程 ;

扩展: 在大型项目开发过程中,所有代码写在一个文件中是不现实的,我们通常将一个子操作分为两个文件: .c文件和.h文件;

.c文件中实现对应的函数,.h中进行函数声明;这样只要在主函数上方 包含 对应的头文件就可以酱紫操作分离出来而不用考虑顺序问题;

C的数据类型:



每个类型占用的字节,下表列出常用数据类型占用的存储空间



运算符

C中的关系运算符 为真返回1, 非真就返回0,;条件语言中 非0即为真;

逻辑&& 和|| 具有穿透性! &&左边为假,右边就不执行了! ||左边为真,右边就不执行!

逗号表达式的值 是 最后一个表达式的值;

数组与指针

数组在C语言中有特殊地位,有很多特性(存储连续的空间,数组名就是地址等),C语言中没有String类型,所以C中的字符串其实就是字符数组,而为了区分末尾会标记\0;

数组除非定义时就部分初始化否则其余未定义的是垃圾值,而不是0;

由于数组的连续性,所以
array == &array[0];
数组名等于数组第一个元素的地址,当数组作参数时是引用传递(指针传递);

数组长度可以由此计算
length = sizeof(array)/sizeof(元素类型)


常用的选择排序法:
for(int j = 5; j>0;j--) {
for(int i=0; i<n-1; i++){
if (arr[i]>arr[i+1]) {
互换
}
}
}


字符串操作相关函数

putchar();//一次只输出一个字符
getchar();//一次只接受一个字符

puts(); //用于输出单个字符串, 不能像printf格式化输出, 会自动添加换行
gets(); // 注意:此函数是不安全的,因为接收的时候不知道他的大小,容易造成溢出;

strlen(); //不计\0的长度计算;
strcpy(,); //字符串赋值
strcat(,); // 拼接, 以第一个\0开始覆盖,完成后再加\0;
strcmp(,); //比较,遇到第一个不想提的 字符 或\0, 就返回两者前后之差;


指针

存放变量地址 的变量;

数组与指针, 如果p指向一个数组, 那么p+1就是指向数组的下一个元素(+1的移动长度与数据类型相关)P可以写p++,但是数组名是常量,不可以这么写;

值:数组名=&数组名=&数组第一元素

虽然值一样,但是意义不一样数组名和&数组第一元素都表示第一元素地址;而&数组名表示整个数组地址,所以,给数组的指针赋值时 只能用&arr,即p=&arr;不能用其他相同值的元素;如下图.



预处理

C程序运行的第一部分编译之前进行的处理操作,是将处理完成新源文件后再进行编译;

宏定义: define

条件编译 : if判断, 如果不过,编译都不会编译

文件包含 : <>表示预处理器会搜索C函数库 头文件路径下的文件, 而使用”“包含是会搜索程序所在目录,其次搜索系统Path定义目录,最后才会搜查C函数库;

变量存储方式和作用域

分全局变量 和 局部变量;

C语言能直接操作内存(指针),所以变量存储的位置又分为: 普通内存(静态存储区),运行时堆栈(动态存储区),硬件寄存器(动态存储区),效率从高到低,根据不同存储位置,可依次分为:静态变量,自动变量,寄存器变量;

1. 静态变量: 全局变量和 使用static声明的局部变量.

静态变量在系统运行过程中只初始化一次. (static声明的局变依旧只能在其作用域中访问,但是生命周期持续到程序结束.)

2. 自动变量: 关键字auto 修饰的局部变量(auto自动省略)

所以所有没有static修饰的局变都是自动变量.一般存于栈区或堆区.在栈区存储方式类似数据结构中的栈,先进后出,程序结束自动释放. 在堆区则是开发人员手动编码分配和释放,存储结构类似于链表;

3. 寄存器变量: register修饰 + 只能是int或char型 + 非静态变量

默认情况下无论自动变量还是静态变量都是在内存中的, 不同之处在于自动变量放在一块运行时分配的特殊内存中,而寄存器变量却是在硬件寄存器中,从物理上来说它和内存不在一个硬件中.寄存器存储空间很小,但是效率很高;

除了存储位置不同,寄存器变量完全符合自动变量的条件,声明周期与自动变量一样;

各存储区域分类:

栈区:存放 局部变量临时变量

堆区:

静态区: 未初始化的全局变量 以及 静态变量

常量区: 已经初始化的全局变量静态变量,常量, 常量字符串, 使用const修饰的全局变量

代码区:源程序,源代码以及运行产生的二进制数据.

寄存器: 寄存器变量

关键字 static 和 extern:控制变量或函数作用域

修饰函数:

static表示此为内部函数,只能本文件访问.

extern表示为外部函数,整个程序访问(默认).

修饰局部变量:

static 延长生命周期

extern 声明一个全局变量

修饰全局变量: static表示变量只能当前程序访问,extern所有文件共享(默认).

特点: 内部函数不同文件可以同名, 同类型全局变量可以重复定义,但内存中只有一份;extern只是声明,不能同时赋值定义;

构造类型:结构体,枚举,共用体

结构体分配内存空间遵循两个原则:

对其算法

每个元素的偏移量(当前离首元素地址字节数)必须是自己所占字节数的整数倍;如果不够,补齐到上一个元素空间中

整个结构体的字节数必须是其最大元素所占字节的整数倍,如果不够,最后一个元素填充字节;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言