当前位置:首页>编程日记>正文

系列-iOS开发-C语言基础

#系列:iOS开发-C语言基础

之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90%的人都熟悉,至于为什么,我也不知道...

首先科普一下C部分的介绍:

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

原谅我直接copy的百科...

接下来我们进入实际的环境中去看看... 创建一个C的项目

随便修改下

  1. main函数是程序入口,一个程序只能有一个main()函数,需要有一个整型返回值(事实上返回值int可以省略,但是这并不代表不返回值,而是默认为int;我们也可以在main()函数中不提供return,这是因为c语言语法要求不够严格)
  2. #include是预处理指令,用于包含指定文件(注意在编译前即处理),它实际做的工作就是把对应文件复制到指定的位置; 包含的内容可以是任何类型的文件,而不仅仅是.h文件;其中< >引用的是编译器的类库路径里面的头文件,而相对应的" "引用的是你程序目录的相对路径中的头文件
  3. 上面的printHello函数必须写在main()函数上面,如果写在下面则必须在main()函数之前声明,至于怎么声明,则可以回去看翻看谭浩强...

原谅我接下来又开始百科.

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

  1. 编译:编译阶段会将对应的xxx.c源文件(ASCII格式)编译成目标文件xxx.obj,它是二进制格式(当然一般我们会有多个.c文件,也就会生成多个对应的.obj);在编译之前要进行预处理(例如#include指令),在编译的同时还要进行语法检查;生成的.obj文件并不能单独执行,因为各个.obj之间是有关联的,而且他们还各自引用了C语言库函数;
  2. 链接:链接的过程就是将各个.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语言对数组的初始化赋值还有以下几点规定:

  1. 可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。例如:int a[10]={0,1,2,3,4}; 表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
  2. 只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:int a[10]={1,1,1,1,1,1,1,1,1,1};而不能写为:int a[10]=1;
  3. 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如: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个元素。 初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'')。 可以用字符串常量来初始化字符数组; char c[]="I am happy"; 注意此时数组的长度不是10,而是11,因为系统自动加上了''结束符。

当然字符数组是可以表示一个字符串,另外我们也可以用指针的形式 char *str = "I am happy"; 字符串中的所有字符在内存中是连续排列的,str 指向的是字符串的第 0 个字符;我们通常将第 0 个字符的地址称为字符串的首地址。字符串中每个字符的类型都是char,所以 str 的类型也必须是char *

再接下来就是刚刚说到的指针,那么什么是指针呢?

存放变量地址的变量我们称之为“指针变量”,简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a。当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为“直接引用”;而当我们通过p取得a的时候首先要先根据p转换成p对应的存储地址,再根据这个地址到其对应的存储空间中拿到存储内容,它的内容其实就是a的地址,然后根据这个地址到对应的存储空间中取得对应的内容,这个内容就是a的值,这种通过p找到a对应地址再取值的方式成为“间接引用”。

原谅我盗用他人的代码

  • int p;中的只是表示p变量是一个指针变量;而打印p的时候,p中的是操作符,表示p指针指向的变量的存储空间(当前存储就是1),同时我们也看到了p==a;修改了*p也就是修改了p指向的存储空间的内容,也就修改了a,所以第二次打印a=2;
  • 指针所指向的类型必须和定义指针时声明的类型相同;上面指针q定义成了int型而指向了char型,结果输出q打印出了2049,是由于局部变量是存储在栈里面的,所以先存储b再存储a、p,当打印p的时候,其实就是以p指向的地址对应的空间开始取两个字节的数据(因为定义p的时候它指向的是int型,在16位编译器下int类型的长度为2),刚好定义的b和c空间连续,所以就取到b的其中一个字节,最后*p二进制存储为“0000100000000001”(见上图黄色背景内容),十进制表示就是2049
  • 指针变量占用的空间和它所指向的变量类型无关,只跟编译器位数有关(准确的说只跟寻址方式有关)

当然以上我说的都是很浅显的东西,我没有深入,比如字符串指针、函数指针等...如果想要深入的话,都可以单独开出一个篇章,谭浩强肯定是这么干的我知道(原谅我老是提起他)...

条件运算符和条件表达式,循环语句 例如条件语句

    if(a>b)  max=a;else max=b;
复制代码

又或者三目表达式

max=(a>b) ? a : b;
复制代码

再或者循环语句

for(int i =0; i < 10 ;i++) {}
复制代码

这些都很熟悉是不是... 那么简单提几点:

  • if-else一个整体是一条语句,不是两条语句。
  • if必须要跟为真语句,可以是空语句,但是不能不跟语句。
  • while语句是一条单语句,while语句必须要有循环体语句,while语句的大括号不是必须的,但是如果有多条语句需要执行,那么必须加大括号构成复合语句。
  • for语句中的两个分号不能省略,若有两个以上的循环体语句那么需要加上花括号。
  • for循环的顺序一定要注意,写法也要注意是分号。
  • break语句:强制中断语句,在循环中强制中断整个循环。
  • continue语句:强制中断语句,在循环中跳过本次循环。

关于C语言部分,我还会慢慢加入.先临时写这么多,慢慢加...

系列:iOS开发-前言+大纲 blog.csdn.net/spicyShrimp…


http://www.coolblog.cn/news/ee42afc9c8317cfa.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐