系列-iOS开发-C语言基础
本站寻求有缘人接手,详细了解请联系站长QQ1493399855
#系列:iOS开发-C语言基础
之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90%的人都熟悉,至于为什么,我也不知道...
首先科普一下C部分的介绍:
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
原谅我直接copy的百科...
接下来我们进入实际的环境中去看看... 创建一个C的项目
随便修改下
- main函数是程序入口,一个程序只能有一个main()函数,需要有一个整型返回值(事实上返回值int可以省略,但是这并不代表不返回值,而是默认为int;我们也可以在main()函数中不提供return,这是因为c语言语法要求不够严格)
- #include是预处理指令,用于包含指定文件(注意在编译前即处理),它实际做的工作就是把对应文件复制到指定的位置; 包含的内容可以是任何类型的文件,而不仅仅是.h文件;其中< >引用的是编译器的类库路径里面的头文件,而相对应的" "引用的是你程序目录的相对路径中的头文件
- 上面的printHello函数必须写在main()函数上面,如果写在下面则必须在main()函数之前声明,至于怎么声明,则可以回去看翻看谭浩强...
原谅我接下来又开始百科.
C语言的运行分为两大步:编译和链接
- 编译:编译阶段会将对应的xxx.c源文件(ASCII格式)编译成目标文件xxx.obj,它是二进制格式(当然一般我们会有多个.c文件,也就会生成多个对应的.obj);在编译之前要进行预处理(例如#include指令),在编译的同时还要进行语法检查;生成的.obj文件并不能单独执行,因为各个.obj之间是有关联的,而且他们还各自引用了C语言库函数;
- 链接:链接的过程就是将各个.obj文件和C语言库函数一起组合生成一个可执行文件的过程;
创建和运行已然说完...发现没有什么想特别说的,绝大部分都是百科的,所以大家可以直接跟我一样,原谅我的偷懒...
那么接下来讲点C里面的东西吧. 首先是C的数据类型:
short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。 至于各长度蛮,某些人就开始说了char占1个字节,short占2个字节,int占4个字节... 但是怎么说呢,C语言其实只做了这些规定 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位。 但是为什么都这么记呢?还是要乖谭浩强,那家伙写的书过时很久了,在16位计算机上,int类型的长度可能为两字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。这里说的都是“可能”,例如,早期的Motorala 68000是一种16/32位的混合型计算机,依赖于不同的命令行选项,一个68000编译程序能产生两字节长或4字节长的int类型...所以我们既然要做开发,那就不要受这些限制,直接打印就是了,看看你用的编译器是怎么支持的不就行了?
一目了然... 所以我此时可以拍着胸口说,在我的64为的mac上面,Xcode中各种数据类型所占字节...说完基本的数据类型,接下来再说说数组. 数组的话,就会想到一维二维什么的,没有关系,一个一个来. 首先是一维数组
在C语言中使用数组必须先进行定义。一维数组的定义方式为: 类型说明符 数组名 [常量表达式]; 其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:
int a[10]; /* 说明整型数组a,有10个元素 */
float b[10], c[20]; /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */
char ch[20]; /* 说明字符数组ch,有20个元素 */
复制代码
来个大家都熟悉的例子:输入一个数组,求最大值
那么如何初始化呢? 类型说明符 数组名[常量表达式] = { 值, 值……值 }; 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。 例如:int a[10]={ 0,1,2,3,4,5,6,7,8,9 };相当于:a[0]=0; a[1]=1 ... a[9]=9;
C语言对数组的初始化赋值还有以下几点规定:
- 可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。例如:int a[10]={0,1,2,3,4}; 表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
- 只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:int a[10]=1;
- 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:int a[5]={1,2,3,4,5};可写为:int a[]={1,2,3,4,5};
关于数组的存储: 数组在内存中存储在一块连续的空间中,如果知道数组类型(int、float等)和初始地址就可以知道其他元素的地址,同时由于数组名等于数组第一个元素的地址,所以当数组作为参数(作为参数时形参可以省略)其实是引用传递。
你会发现一个规律,每个地址都比前一个多了4,想想这是为什么呢?会不会是每个int占4个字节呢?答案是肯定的,就是你想的.二维数组(多维数组) 多维数组其实可以看成是一个特殊的一维数组,只是每个元素又是一个一维数组,没有想象中的那么复杂 例如:int a[3][4]={1,2,3,4,5,6,7,8,4,4,4,4}; 也可以这样int b[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; 当然也可以这样:int c[2][3]; c[0][0] = 1; c[0][1] = 2; c[0][2] = 3; c[1][0] = 4; c[1][1] = 5; c[1][2] = 6; 我们还可以省略行号,当然咧号是不可以省略的 int d[][3] = { {1,2,3},{4,5,6} }; 那么我们如何取到想要的元素呢? 一个简单的表达式: a=a[0]=&a[0][0]; a[i][j]=a[i]+j;
接下来是字符和字符串: 字符和字符串区别 ‘a’和”a”的区别:C规定以字符’ ’作为字符串结束标志,’ ’是一个ASCII码为0的字符,它不会引起任何控制动作,也不是一个可显示的字符。字符串”a”实际包含2个字符:’a’和’ ’ C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。 定义: char c[10] 字符型与整型互相通用,因此 int c[10] 也可以定义字符数组。但由于两种类型分配字节不同, 用整型来定义会浪费空间, 另外这样定义实际意义也不大, 只是为了说明其合法性。 最简单的方法即逐个赋值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10个字符分别赋绐c[0]到c[9]10个元素。 初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'