vb数组赋值声明格式为什么是a[3][2]?

(答案不唯一,仅供参考,文章最后有福利)

四、编码格式(优化细节)
  1. 设计模式是什么? 你知道哪些设计模式,并简要叙述?

    设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。
    3). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。
    4). 观察者模式:KVO是典型的观察者模式,观察某个属性的状态,状态发生变化时通知观察者。
    5). 委托模式:代理+协议的组合。实现1对1的反向传值操作。
    6). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。

  2. MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中去处理。
    MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进。

  3. 1). #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。
    2). @class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。

  4. frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父view的坐标系统)
    bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)

  5. Objective-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方法用继承好还是分类好?为什么?

    答:Objective-C的类不可以多重继承;可以实现多个接口(协议);Category是类别;一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

  6. 操作的完整性,而nonatomic就没有这个保证了。所以,nonatomic的速度要比atomic快。
    不过atomic可并不能保证线程安全。

  7. 什么情况使用 weak 关键字,相比 assign 有什么不同?

    1.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性。
    2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。

    IBOutlet连出来的视图属性为什么可以被设置成weak?
    因为父控件的subViews数组已经对它有一个强引用。

    weak 表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)。

  8. 怎么用 copy 关键字?

    block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。

  9. 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的),为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

    1. 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本。
    2. 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。

    总结:使用copy的目的是,防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发送变化会无意间篡改不可变类型对象原来的值。

  10. 浅拷贝和深拷贝的区别?

    浅拷贝:只复制指向对象的指针,而不复制引用对象本身。
    深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,当修改A时,A_copy不变。

在非集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制; 在集合类对象中,对不可变对象进行copy操作,是指针复制,mutableCopy操作是内容复制;

只有对不可变对象进行copy操作是指针复制(浅复制),其它情况都是内容复制(深复制)!

  1. 如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?

    若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。
    // 该协议只有一个方法:

  1. 常见的 Objective-C 的数据类型有那些,和C的基本数据类型有什么区别?如:NSInteger和int

  2. id 声明的对象有什么特性?

    id 声明的对象具有运行时的特性,即可以指向任意类型的Objcetive-C的对象。

  3. Objective-C 如何对内存管理的,说说你的看法和解决方法?

    答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
    1). 自动内存计数ARC:由Xcode自动在App编译阶段,在代码中添加内存管理代码。
    2). 手动内存计数MRC:遵循内存谁申请、谁释放;谁添加,谁释放的原则。
    3). 内存释放池Release Pool:把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。

  4. Objective-C 中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

  5. 1. 分类有名字,类扩展没有分类名字,是一种特殊的分类。
    2. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。
    3. 继承可以增加,修改或者删除方法,并且可以增加属性。

  6. 我们说的OC是动态运行时语言是什么意思?

    答:主要是将数据类型的确定由编译时,推迟到了运行时。简单来说, 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

  7. Delegate(委托模式):1对1的反向消息通知功能。
    Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。

  8. // 当被观察的属性发送变化时,会自动触发下方方法

  9. 当一个对象调用setValue方法时,方法内部会做以下操作:
    1). 检查是否存在相应的key的set方法,如果存在,就调用set方法。
    2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。
    3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。
    这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

  10. 方法和选择器有何不同?

    selector是一个方法的名字,方法是一个组合体,包含了名字和实现。

  11. 你是否接触过OC中的反射机制?简单聊一下概念和使用

  12. 如何对iOS设备进行性能测试?

  13. 开发项目时你是怎么检查内存泄露?

  14. 答:懒加载就是只在用到的时候才去初始化。也可以理解成延时加载。
    我觉得最好也最简单的一个例子就是tableView中图片的加载显示了, 一个延时加载, 避免内存过高,一个异步加载,避免线程堵塞提高用户体验。

  15. isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调 用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass)。根元类的isa指针指向本身,这样形成了一个封闭的内循环。

  16. 如何访问并修改一个类的私有属性?

    1). 一种是通过KVC获取。
    2). 通过runtime访问并修改私有属性。

  17. 一个objc对象的isa的指针指向什么?有什么作用?

    答:指向他的类对象,从而可以找到对象上的方法。

  18. 写一个完整的代理,包括声明、实现

  1. isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。
    selector:通过方法名,获取在内存中的函数的入口地址。

  2. 1). 二者都用于传递消息,不同之处主要在于一个是一对一的,另一个是一对多的。
    3). delegate需要两者之间必须建立联系,不然没法调用代理的方法;notification不需要两者之间有联系。

  3. 闭包(block):闭包就是获取其它函数局部变量的匿名函数。

* 在控制器间传值可以使用代理或者block,使用block相对来说简洁。
  1. 答:这种问题在开发时经常遇到。原因是访问了野指针,比如访问已经释放对象的成员变量或者发消息、死循环等。

  2. lldb(gdb)常用的控制台调试命令?

  3. 2). Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能。
    3). Allocations:用来检查内存,写算法的那批人也用这个来检查。
    4). Leaks:检查内存,看是否有内存泄露。

  4. iOS中常用的数据存储方式有哪些?

  5. iOS的沙盒目录结构是怎样的?

    1. AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
    2. Documents:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。iCloud备份目录。(这里不能存缓存文件,否则上架不被通过)
    3. Library 目录:这个目录下有两个子目录:
    Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
    Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
    可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。
    4. tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能。

  6. iOS多线程技术有哪几种方式?

  7. 写出使用GCD方式从子线程回到主线程的方法代码

  8. 如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)

}); // 输出结果: 任务1 任务2 ——》 任务 barrier ——》任务3 任务4 // 其中的任务1与任务2,任务3与任务4 由于是并行处理先后顺序不定。
  1. 以下代码运行结果如何?
} // 只输出:1。(主线程死锁)
    • 从字面上看,就是运行循环,跑圈
    • 其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer)
    • 一个线程对应一个RunLoop,基本作用就是保持程序的持续运行,处理app中的各种事件。
    • 通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。
  1. Runtime又叫运行时,是一套底层的C语言API,其为iOS内部的核心之一,我们平时编写的OC代码,底层都是基于它来实现的。

  1. Runtime实现的机制是什么,怎么用,一般用于干嘛?

    有了Runtime库,能做什么事情呢?
    Runtime库里面包含了跟类、成员变量、方法相关的API。
    (1)获取类里面的所有成员变量。
    (2)为类动态添加成员变量。
    (3)为类动态添加新的方法。
    因此,有了Runtime,想怎么改就怎么改。

  2. 什么是 Method Swizzle(黑魔法),什么情况下会使用?

    1). 在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力抢先之外,还有更加灵活的方法 Method Swizzle。
    2). Method Swizzle 指的是改变一个已存在的选择器对应的实现的过程。OC中方法的调用能够在运行时通过改变,通过改变类的调度表中选择器到最终函数间的映射关系。
    3). 在OC中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用OC的动态特性,可以实现在运行时偷换selector对应的方法实现。
    4). 每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的方法实现。

  3. _objc_msgForward 函数是做什么的,直接调用它将会发生什么?

    答:_objc_msgForward是 IMP 类型,用于消息转发的:当向一个对象发送一条消息,但它并没有实现的时候,_objc_msgForward会尝试做消息转发。

  4. TCP:传输控制协议。
    UDP:用户数据协议。

    TCP 是面向连接的,建立连接需要经历三次握手,是可靠的传输层协议。
    UDP 是面向无连接的,数据传输是不可靠的,它只管发,不管收不收得到。
    简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般。

  5. 通信底层原理(OSI七层模型)

    OSI采用了分层的结构化技术,共分七层:
    物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  6. XMPP是一种以XML为基础的开放式实时通信协议。
    简单的说,XMPP就是一种协议,一种规定。就是说,在网络上传东西,XMM就是规定你上传大小的格式。

  7. OC中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?

  1. 答:UITableView 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识符,即指定了单元格的种类,当屏幕上的单元格滑出屏幕时,系统会把这个单元格添加到重用队列中,等待被重用,当有新单元格从屏幕外滑入屏幕内时,从重用队列中找看有没有可以重用的单元格,如果有,就拿过来用,如果没有就创建一个来使用。

  2. 用伪代码写一个线程安全的单例模式

  1. 在手势对象基础类UIGestureRecognizer的常用子类手势类型中哪两个手势发生后,响应只会执行一次?

* 正确的解决方案:使用绘图技术
  1. 你是怎么封装一个view的
1). 可以通过纯代码或者xib的方式来封装子控件 2). 建立一个跟view相关的模型,然后将模型数据传给view,通过模型上的数据给view的子控件赋值 /**
 * 纯代码初始化控件时一定会走这个方法
  1. 1. GET用于向服务器请求数据,POST用于提交数据
    2. GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作
    3. GET请求的URL有长度限制,POST请求不会有长度限制

  2. 请简单的介绍下APNS发送系统消息的机制

    APNS优势:杜绝了类似安卓那种为了接受通知不停在后台唤醒程序保持长连接的行为,由iOS系统和APNS进行长连接替代。
    2). 应用程序接收到设备令牌并发送给自己的后台服务器
    3). 服务器把要推送的内容和设备发送给APNS
    4). APNS根据设备令牌找到设备,再由iOS根据APPID把推送内容展示

Single是一个单例类,并且有一个字符串类型的属性titleName

第四种:block传值



注:此方法是一种非阻塞的执行方式,未找到取消执行的方法。 > 程序运行结束 注:此方法是一种非阻塞的执行方式, > 程序运行结束 注:此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。 没有找到取消执行方式。 > 程序运行结束 注:此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。 > 程序运行结束
  1. 答:NSPersistentStoreCoordinator是持久化存储协调者,主要用于协调托管对象上下文和持久化存储区之间的关系。NSManagedObjectContext使用协调者的托管对象模型将数据保存到数据库,或查询数据。

  2. 您是否做过一部的网络处理和通讯方面的工作?如果有,能具体介绍一下实现策略么?

  3. 你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?

    代码交换两个方法,在写unit test时使用到。

  4. Core开头的系列的内容。是否使用过CoreAnimation和CoreGraphics。UI框架和CA,CG框架的联系是什么?分别用CA和CG做过些什么动画或者图像上的内容。(有需要的话还可以涉及Quartz的一些内容)

    使用CA做过menu菜单的展开收起(太逊了)

  5. 答:CoreText可以解决复杂文字内容排版问题。CoreImage可以处理图片,为其添加各种效果。体验是很强大,挺复杂的。

  6. 自动释放池是什么,如何工作

    答:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放.它仍然是个OC的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

  7. NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)

    coding)的,KVC是一个通过属性名访问属性变量的机制。例如将Module层的变化,通知到多个Controller对象时,可以使用NSNotification;如果是只需要观察某个对象的某个属性,可以使用KVO。
    对于委托模式,在设计模式中是对象适配器模式,其是delegate是指向某个对象的,这是一对一的关系,而在通知模式中,往往是一对多的关系。委托模式,从技术上可以现在改变delegate指向的对象,但不建议这样做,会让人迷惑,如果一个delegate对象不断改变,指向不同的对象。

  8. 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和G.C.D的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

    NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

  9. 既然提到G.C.D,那么问一下在使用G.C.D以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?

    答:使用block是要注意,若将block做函数参数时,需要把它放到最后,GCD是Grand Central Dispatch,是一个对线程开源类库,而Block是闭包,是能够读取其他函数内部变量的函数。

  10. 对于Objective-C,你认为它最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?

> 答:最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲突,可以使用link命令及flag解决冲突。
  1. 你实现过一个框架或者库以供别人使用么?如果有,请谈一谈构建框架或者库时候的经验;如果没有,请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架。
> 答:抽象和封装,方便使用。首先是对问题有充分的了解,比如构建一个文件解压压缩框架,从使用者的角度出发,只需关注发送给框架一个解压请求,框架完成复杂文件的解压操作,并且在适当的时候通知给是哦难过者,如解压完成、解压出错等。在框架内部去构建对象的关系,通过抽象让其更为健壮、便于更改。其次是API的说明文档。
  1. 加载图片的过程大致如下:
    1.首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存
    2.如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来
    3.如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片
    4.下载后的图片会加入缓存中,并写入磁盘中
    5.整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来

    1. 从内存(字典)中找图片(当这个图片在本次使用程序的过程中已经被加载过),找到直接使用。
    2. 从沙盒中找(当这个图片在之前使用程序的过程中被加载过),找到使用,缓存到内存中。
    3. 从网络上获取,使用,缓存到内存,缓存到沙盒。

  1. 友盟统计接口统计的所有功能

    APP启动速度,APP停留页面时间等

1.不用中间变量,用两种方法交换A和B的值

* 栈是一种数据结构,特点:先进后出 * 练习:使用全局变量模拟栈的操作
选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:
 * 都将数组分为已排序部分和未排序部分。 1\. 选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。 2\. 冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。 3\. 插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。 
  • 选择排序 /** * 【选择排序】:最值出现在起始端 * * 第1趟:在n个数中找到最小(大)数与第一个数交换位置 * 第2趟:在剩下n-1个数中找到最小(大)数与第二个数交换位置 * 重复这样的操作...依次与第三个、第四个...数交换位置 * 第n-1趟,最终可实现数据的升序(降序)排列。 * / void selectSort(int arr, } } * 冒泡排序 / * 【冒泡排序】:相邻元素两两比较,比较完一趟,最值出现在末尾 * 第1趟:依次 比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n个元素位置 * 第2趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n-1个元素位置 * …… …… *


5.折半查找(二分查找)

* 折半查找:优化查找时间(不用遍历全部数据) * * 折半查找的原理: * 3> 动态计算mid的值,取出mid对应的值进行比较 * 4> 如果mid对应的值大于要查找的值,那么max要变小为mid-1 * 5> 如果mid对应的值小于要查找的值,那么min要变大为mid+1

2.避免使用C语言中的基本数据类型,建议使用 Foundation 数据类型,对应关系如下:

  1. HomeKit,是苹果2014年发布的智能家居平台。

  2. Quatarz 2d 是Apple提供的基本图形工具库。只是适用于2D图形的绘制。
    OpenGL,是一个跨平台的图形开发库。适用于2D和3D图形的绘制。

  3. ffmpeg 是音视频处理工具,既有音视频编码解码功能,又可以作为播放器使用。

  4. 4). 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
    5). 滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!
    6). 减少子视图的层级关系;
    7). 尽量使所有的视图不透明化以及做切圆操作;
    8). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完,然后通过hidden来控制是否显示;
    9). 使用调试工具分析问题。

  5. 如何实行cell的动态的行高

  6. 栈上的自动复制到堆上,block 的属性修饰符是 copy,循环引用的原理和解决方案。

    block的循环引用;block的代码实现;为什么会造成循环引用;block是如何强引用self的;

  7. 什么是野指针、空指针?

    野指针:不知道指向了哪里的指针叫野指针。即指针指向不确定,指针存的地址是一个垃圾值,未初始化。
    空指针:不指向任何位置的指针叫空指针。即指针没有指向,指针存的地址是一个空地址,NULL。

  8. 多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色;从操作系统角度,是多任务,现在用的主流操作系统都是多任务的,可以一边听歌、一边写博客;对于应用来说,多线程可以让应用有更快的回应,可以在网络下载时,同时响应用户的触摸操作。在iOS应用中,对多线程最初的理解,就是并发,它的含义是原来先做烧水,再摘菜,再炒菜的工作,会变成烧水的同时去摘菜,最后去炒菜。

  9. iOS中的多线程,是Cocoa框架下的多线程,通过Cocoa的封装,可以让我们更为方便的使用线程,做过C++的同学可能会对线程有更多的理解,比如线程的创立,信号量、共享变量有认识,Cocoa框架下会方便很多,它对线程做了封装,有些封装,可以让我们创建的对象,本身便拥有线程,也就是线程的对象化抽象,从而减少我们的工程,提供程序的健壮性。

    GCD是(Grand Central Dispatch)的缩写 ,从系统级别提供的一个易用地多线程类库,具有运行时的特点,能充分利用多核心硬件。GCD的API接口为C语言的函数,函数参数中多数有Block,关于Block的使用参看这里,为我们提供强大的“接口”,对于GCD的使用参见本文

    NSOperation是一个抽象类,它封装了线程的细节实现,我们可以通过子类化该对象,加上NSQueue来同面向对象的思维,管理多线程程序。具体可参看这里:一个基于NSOperation的多线程网络访问的项目。

    NSThread是一个控制线程执行的对象,它不如NSOperation抽象,通过它我们可以方便的得到一个线程,并控制它。但NSThread的线程之间的并发控制,是需要我们自己来控制的,可以通过NSCondition实现。

    在Cocoa的框架下,通知、Timer和异步函数等都有使用多线程,(待补充).

  10. 在项目什么时候选择使用GCD,什么时候选择NSOperation?

    项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。

    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

    • KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。

    • NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

    • delegate 是代理,就是我不想做的事情交给别人做。比如狗需要吃饭,就通过delegate通知主人,主人就会给他做饭、盛饭、倒水,这些操作,这些狗都不需要关心,只需要调用delegate(代理人)就可以了,由其他类完成所需要的操作。所以delegate是一对一关系。

    • block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。

    • KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如买卖股票,我们一般使用delegate。
      Notification一般是进行全局通知,比如利好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就需要知道经纪人,经纪人也不要知道自己的顾客。Notification是弱关联,利好消息发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接收的人也可以正常发出消息。

  11. 将一个函数在主线程执行的4种方法

  1. 如何让计时器调用一个类方法

    • 计时器只能调用实例方法,但是可以在这个实例方法里面调用静态方法。
    • 使用计时器需要注意,计时器一定要加入RunLoop中,并且选好model才能运行。scheduledTimerWithTimeInterval方法创建一个计时器并加入到RunLoop中所以可以直接使用。
    • 如果计时器的repeats选择YES说明这个计时器会重复执行,一定要在合适的时机调用计时器的invalid。不能在dealloc中调用,因为一旦设置为repeats 为yes,计时器会强持有self,导致dealloc永远不会被调用,这个类就永远无法被释放。比如可以在viewDidDisappear中调用,这样当类需要被回收的时候就可以正常进入dealloc中了。
    • 1、在子类中实现一个同基类名字一样的静态方法

    • 2、在调用的时候不要使用类名调用,而是使用[self class]的方式调用。原理,用类名调用是早绑定,在编译期绑定,用[self class]是晚绑定,在运行时决定调用哪个方法。

  2. NSTimer创建后,会在哪个线程运行

    • 自己创建的Timer,加入到哪个线程的RunLoop中就运行在哪个线程。

    • id可以理解为指向对象的指针。所有oc的对象 id都可以指向,编译器不会做类型检查,id调用任何存在的方法都不会在编译阶段报错,当然如果这个id指向的对象没有这个方法,该崩溃还是会崩溃的。

    • NSObject *指向的必须是NSObject的子类,调用的也只能是NSObjec里面的方法否则就要做强制类型转换。

    • 不是所有的OC对象都是NSObject的子类,还有一些继承自NSProxy。NSObject *可指向的类型是id的子集。

  • 1.在函数体内定义的static他的作用域为该函数体,该变量在内存中只被分配一次,因此,其值在下次调用时仍维持上次的值不变;
    2.在模块内的static全局变量可以被模块内所有函数访问,但是不能被模块外的其他函数访问;
    3.在模块内的staic全局变量可以被这一模块内的其他函数调用,这个函数的使用范围被限制在这个模块内;
    4.在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝,也就是说只要是该类的对象,那么该对象的中被static修饰的成员变量都指向同一块地址。

  • 1.延长局部变量的生命周期,程序结束才会销毁。
    2.局部变量只会生成一份内存,只会初始化一次。
    3.改变局部变量的作用域。

    1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改
    2.避免重复定义全局变量

  • 在OC中static关键字使用误区

    1.使用static修饰实例变量是不被允许的
    2.使用static修饰了方法,也是错误的

  1. 使用 Swift 语言编程的优缺点
    总的来说,我认为使用 Swift 来作为编程语言的优点还是要远远大于缺点的,而且很多缺点苹果也在逐渐改善。
  • Swift 语言本身提供了对函数式编程的支持。
    Objc 本身是不支持的,但是可以通过引入 ReactiveCocoa 这个库来支持函数式编程。
    4、编写 OS X 下的自动化脚本

  • 使用Swift 后, App 体积大概增加 5-8 M 左右,对体积大小敏感的慎用。
    体积变大的原因是因为 Swift 还在变化,所以 Apple 没有在 iOS 系统里放入 Swift 的运行库,反而是每个 App 里都要包含其对应的 Swift 运行库。
    如果你是使用 Xcode经常卡住或者崩溃想必你是肯定碰到过了,这个是目前使用 Swift 最让人头疼的事情,即使是到现在XCode 9, 有时候也会遇到这种问题,所以要看你的承受力了……
    3、第三方库的支持不够多
    目前确实 Swift 编写的第三方库确实不多,但可以通过桥接的方式来使用 Objc 的三方库,基本上没有太大问题。现在已经改善很多了…
    4、语言版本更新带来的编译问题
    语言本身还在发展,所以每次版本更新后都会出现编译不过的情况(至少到目前为止还是),但是自从 4.0 版本发布后,改动没有 beta 时候那么大了,而且根据 Xcode 提示基本就可以解决语法变动导致的编译问题了。

  • 最近在面试,总结总结遇到的面试题. 基础问题 LRU算法 [内存管理]的一种页面置换算法,对于在内存中但又不用的[...

  • ES 简介 一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。全文检索是指计算机...

  • 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...

  • 一、jQuery简介 JQ是JS的一个优秀的库,大型开发必备。在此,我想说的是,JQ里面很多函数使用和JS类似,所...

  • 跑马灯在项目了其实应用的还比较多,特别是做多媒体的时候,音乐视频蓝牙等等经常用到。 比如音乐的专辑信息,蓝牙通话记...

  • 今天给大家上道昆明的特色小吃:豆花米线。过桥米线是全国人民都知道的,在各地都能吃到。小锅米线是比较简易的,在家里就...

  • “我”来到飞岛后,发现拉普塔人的外貌,服装都十分奇怪,让人惊讶。当地人很容易陷入沉思,自己说不出话,也听不见别人说...

1)程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构。

2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。

3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址。

4)bit是位是指为0或者1。 byte 是指字节, 一个字节 = 八个位。

1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

3、每个C语言程序中main函数是有且只有一个。

4、在函数中不可以再定义函数。

5、算法:可以没有输入,但是一定要有输出。

7、逗号运算符的级别最低,赋值的级别倒数第二。

第一章C语言的基础知识

第一节、对C语言的基础认识

1、C语言编写的程序称为源程序,又称为编译单位。

2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。

3、一个C语言程序有且只有一个main函数,是程序运行的起点。

1、VC是软件,用来运行写的C语言程序。

2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---à.obj---à.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!)

1、标识符(必考内容):

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了

2、标识符分为关键字、预定义标识符、用户标识符。

关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。

用户标识符:基本上每年都考,详细请见书上习题。

十进制转换成二进制、八进制、十六进制。

二进制、八进制、十六进制转换成十进制。

1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次)

a、C语言中的八进制规定要以0开头。018的数值是非法的,八进制是没有8的,逢8进1。

b、C语言中的十六进制规定要以0x开头。

2)小数的合法写法:C语言小数点两边有一个是零的话,可以不用写。

1.0在C语言中可写成1.

0.1在C语言中可以写成.1。

3)实型数据的合法形式:

b、考试口诀:e前e后必有数,e后必为整数。请结合书上的例子。

4) 整型一般是4个字节, 字符型是1个字节,双精度一般是8个字节:

第六、七节:算术表达式和赋值表达式

核心:表达式一定有数值!

1、算术表达式:+,-,*,/,%

考试一定要注意:“/” 两边都是整型的话,结果就是一个整型。 3/2的结果就是1.

“/” 如果有一边是小数,那么结果就是小数。 3/2.0的结果就是1.5

“%”符号请一定要注意是余数,考试最容易算成了除号。)%符号两边要求是整数。不是整数就错了。[注意!!!]

2、赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

1、int x=y=10: 错啦,定义时,不可以连续赋值。

x=y=10; 对滴,定义完成后,可以连续赋值。

3、赋值的左边只能是一个变量。

3、复合的赋值表达式:

a*=2+3;运行完成后,a的值是12。

一定要注意,首先要在2+3的上面打上括号。变成(2+3)再运算。

自加、自减表达式:假设a=5,++a(是为6), a++(为5);

运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,

再放到变量a中。 进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。

考试口诀:++在前先加后用,++在后先用后加。

优先级别最低。表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

z=(2,3,4)(整个是赋值表达式) 这个时候z的值为4。(有点难度哦!)

z= 2,3,4 (整个是逗号表达式)这个时候z的值为2。

1、空语句不可以随意执行,会导致逻辑错误。

2、注释是最近几年考试的重点,注释不是C语言,不占运行时间,没有分号。不可以嵌套!

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。前是把a+b转型,后是把a转型再加b。

4、三种取整丢小数的情况:

不丢小数办法:在相应的格式中加前缀.2保留2位,四舍五入

1)字符数据的合法形式::

'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。

一般考试表示单个字符错误的形式:'65' "1"  

字符是可以进行算术运算的,记住: '0'-0=48

大写字母和小写字母转换的方法: 'A'+32='a' 相互之间一般是相差32。

转义字符分为一般转义字符、八进制转义字符、十六进制转义字符。

一般转义字符:背诵\0、 \n、 \’、 \”、 \\。

八进制转义字符: ‘\141’ 是合法的, 前导的0是不能写的。

十六进制转义字符:’\x6d’ 才是合法的,前导的0不能写,并且x是小写。

3、字符型和整数是近亲:两个具有很大的相似之处

位运算的考查:会有一到二题考试题目。

总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

    b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。

例2: 一定要记住,异或的位运算符号” ^ ”。0 异或 1得到1。0 异或 0得到0。两个女的生不出来。

考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。

例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。   

第一节:数据输出(一)(二)

2、printf可以只有一个参数,也可以有两个参数。(选择题考过一次)

3、printf(“ 第一部分 ”,第二部分 );把第二部分的变量、表达式、常量以第一部分的形式展现出来!

一定要记住是将12和34以第一部分的形式现在在终端也就是黑色的屏幕上。考试核心为:一模一样。在黑色屏幕上面显示为 a=12,b=34

提示输出错误解决办法(整形数组)

3、int x=017; 一定要弄清楚为什么是这个结果!过程很重要

printf(“%d ”,x,y); 一个格式说明,两个输出变量,后面的y不输出

防止非法输入while(~scanf()){}

一定要记住是以第一部分的格式在终端输入数据。考试核心为:一模一样。

在黑色屏幕上面输入的为 a=12,b=34才可以把12和34正确给a和b 。有一点不同也不行。

2、scanf(“%d,%d”,x,y);这种写法绝对错误,scanf的第二个部分一定要是地址。

scanf(“%d,%d”,&x,&y);注意写成这样才可以!没地址一开始运行就会bug

3、特别注意指针在scanf的考察

4、指定输入的长度 (考试重点)

终端输入:1 234567 由于1和2中间有空格,所以只有1位给x

5、字符和整型是近亲:

6、输入时候字符和整数的区别(考试超级重点)

scanf(“%d”,&x);这个时候输入1,特别注意表示的是整数1

scanf(“%c”,&x);这个时候输入1,特别注意表示的是字符‘1’ASCII为整数48。

1)scanf函数的格式考察:

注意该函数的第二个部分是&a 这样的地址,不是a;

char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。

putchar(‘y’)把字符y输出到屏幕中。

3)如何实现两个变量x ,y中数值的互换(要求背下来)

4)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)

y=(int)(x*)/1000.0 这个保留三位,对第四位四舍五入

y=(int)(x*)/10000.0 这个保留四位,对第五位四舍五入

这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。

特别要注意:C语言中是用非0表示逻辑真的,用0表示逻辑假的。

C语言有构造类型,没有逻辑类型。

关系运算符号:注意<=的写法,==和=的区别!(考试重点)

if只管后面一个语句,要管多个,请用大括号!

a、表达式的数值只能为1(表示为真),或0(表示假)。

如 9>8这个关系表达式是真的,所以9>8这个表达式的数值就是1。

如 7<6这个关系表达式是假的,所以7<6这个表达式的数值就是0

错的,但是如果是C语言那么就是正确的!因为要1<0为假得到0,表达式就变成

了0<2那么运算结果就是1,称为了真的了!

c、等号和赋值的区别!一定记住“=”就是赋值,“= =”才是等号。

核心:表达式的数值只能为1(表示为真),或0(表示假)。

c) 注意短路现象。考试比较喜欢考到。详细请见书上例子,一定要会做例1和例2

d) 表示 x 小于0大于10的方法。

a、else 是与最接近的if且没有else的语句匹配。

b、交换的程序写法:t=x;x=y;y=t;

表达式1 ?表达式2 :表达式3

a、考试口诀:真前假后。

b、注意是当表达式1的数值是非0时,才采用表达式2的数值做为整个运算结果,当表达式1的数值为0时,就用表达式3的数值做为整个的结果。

a) 执行的流程一定要弄懂!上课时候详细的过程讲了,请自己一定弄懂!

b)注意有break 和没有break的差别,书上的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。break在C语言中就是分手,一刀两断的意思。

d) switch(x) x:是整型常量,字符型常量,枚举型数据。

e)switch是必考题型,请大家一定要完成书上的课后的switch的习题。

b)for循环当中必须是两个分号,千万不要忘记。

c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。

d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错),do-while循环是至少执行一次循环。

记忆方法:break:是打破的意思,(破了整个循环)所以看见break就退出整个一层循环。

continue: 是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。

就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。

(!=号的级别高于=号 所以第一个先计算 3!=2) 第一个a的数值是得到的1;第二个a的数值是3。

考试注意点: 括号在这里的重要性。

5)每行输出五个的写法:

6)如何整除一个数:i%5==0表示整除5

I%2==0表示整除2,同时表示是偶数!

7)输入123,输出321逆序输出数据

8)for只管后面一个语句:

printf(“#”): 请问最终打印几个#号?答案为一个! 9)不停的输入,直到输入# 停止输入! 不停的输入,直到输入$停止输入! 不停的输入,直到遇到?停止输入! while((x=getchar())!=’ ? ’) 解说:一定要注意这种给出了条件,然后如何去写的方法!

10)for循环和switch语句的和在一起考题!

11)多次出现的考题:

1、函数:是具有一定功能的一个程序块,是C语言的基本组成单位。

2、函数不可以嵌套定义。但是可以嵌套调用。

3、函数名缺省返回值类型,默认为 int。

4、C语言由函数组成,但有且仅有一个main函数!是程序运行的开始!

5、如何判断a是否为质数:背诵这个程序

6、如何求阶层:n! 背诵这个程序!

7、函数的参数可以是常量,变量,表达式,甚至是函数调用。

8、 函数的参数,返回数值(示意图):

9、一定要注意参数之间的传递

实参和形参之间 传数值,和传地址的差别。(考试的重点)

传数值的话,形参的变化不会改变实参的变化。

传地址的话,形参的变化就会有可能改变实参的变化。

10、函数声明的考查:

一定要有:函数名,函数的返回类型,函数的参数类型。不一定要有:形参的名称。

填空题也可能会考到!以下是终极难度的考题。打横线是函数声明怎么写!

}已经知道函数是这样。这个函数的正确的函数声明怎么写?

11、要求掌握的库函数:

a、库函数是已经写好了函数,放在仓库中,我们只需要如何去使用就可以了!

b、以下这些库函数经常考到,所以要背诵下来。

指针一定要初始化NULL

指针变量的本质是用来放地址,而一般的变量是放数值的。

1、int *p 中 *p和p的差别:简单说*p是数值,p是地址!

*p可以当做变量来用;*的作用是取后面地址p里面的数值

p是当作地址来使用。可以用在scanf函数中:scanf(“%d”,p);

2、*p++ 和 (*p)++的之间的差别:改错题目中很重要!考试超级重点

*p++是 地址会变化。 口诀:取当前值,然后再移动地址!

*p)++ 是数值会要变化。 口诀:取当前值,然后再使数值增加1。

请问*p++和(*p)++的数值分别为多少?

*p++: 这个本身的数值为1。由于是地址会增加一,所以指针指向数值3了。

(*p)++ 这个本身的数值为1。由于有个++表示数值会增加,指针不移动,但数值1由于自加了一次变成了2。

*p:一级指针:存放变量的地址。

**q:二级指针:存放一级指针的地址。

问你:*p为多少?*q为多少?**q为多少? 再问你:**q=&x的写法可以吗? 不可以,因为二级指针只能存放一级指针的地址。

4、三名主义:(考试的重点)

数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次)

函数名:表示该函数的入口地址。

字符串常量名:表示第一个字符的地址。

5、移动指针(经常加入到考试中其他题目综合考试)

这个s首先会指向第一个字母m然后通过循环会一次打印出一个字符,s++是地址移动,打印了一个字母后,就会移动到下一个字母!

6、指针变量两种初始化(一定要看懂)

方法二:int a=2,*p;  (定义之后初始化)

7、传数值和传地址(每年必考好多题目)

这个题目答案是1和3。 这个题目的答案就是3和1。

传数值,fun是用变量接受,所以fun中 传地址,fun用指针接受!这个时候fun

的交换不会影响到main中的x和y 。 中的交换,就会影响到main中的x和y。

传数值,形参的变化不会影响实参。 传地址形参的变化绝大多数会影响到实参!

8、函数返回值是地址,一定注意这个*号(上机考试重点)

int *fun(int*a,int *b) 可以发现函数前面有个*,这个就说明函数运算结果是地址 
 

指针变量是存放地址的。并且指向哪个就等价哪个,所有出现*p的地方都可以用它等价的代替。例如:

(由于*p指向变量a,所以指向哪个就等价哪个,这里*p等价于a,可以相当于是a=a+2) 

数组: 存放的类型是一致的。多个数组元素的地址是连续的。

1、一维数组的初始化:

int a[5];注意这个地方有一个重要考点,定义时数组的个数不是变量一定是常量。
int a[1+1] 合法,个数是常量2,是个算术表达式
 

1)一维数组的重要概念:

对a[10]这个数组的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[0]的地址。(等价于&a)

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。

3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 

1、a表示数组名,是第一个元素的地址,也就是元素a[0][0]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。

3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。

4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。

5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。

2) 二维数组做题目的技巧:

步骤一:把他们写成:      

第一列 第二列 第三列  
 

步骤二:这样作题目间很简单:    

*(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。

*(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。

一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。

3) 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写

4) 二维数组中的行指针

其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针

a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用

5) 还有记住脱衣服法则:超级无敌重要

把上课时候讲的文件这一章的题目要做一遍,一定要做,基本上考试的都会在练习当中。

1)字符串的 strlen() 和 strcat() 和strcmp() 和strcpy()的使用方法一定要记住。他们的参数都是地址。其中strcat()和strcmp()有两个参数。

3)define f(x)(x*x) 和 define f(x) x*x 之间的差别。一定要好好的注意这写容易错的地方,替换的时候有括号和没有括号是很大的区别。

6)函数的递归调用一定要记得有结束的条件,并且要会算简单的递归题目。要会作递归的题目

7)结构体和共用体以及链表要掌握最简单的。typedef考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。

总内存 16 (最大内存为单位,存不下再开辟一个单元) 8(最大内存为单位,不停迭代)

结构体成员:结构体变量.成员 (*p).成员 p->成员名

成员为数组时输入不用&其他都要只能对最低一级成员操作

strcut 结构体{成员类型成员名}变量名列表 可以嵌套使用

链表及动态链表 在成员中加个指针

8)函数指针的用法(*f)()记住一个例子:

赋值之后:合法的调用形式为1、add(2,3);

3、(*f)(2,3)

9)两种重要的数组长度:

那么scanf(“%s”,a); 只会接收 good. 考点:不可以接收空格。

12)“文件包含”的考查点:

这里一个C语言程序是有两个文件组成,分别是no1.c, no2.c。那么no1.c中最开始有个#include”no2.c”他表示把第二个文件的内容给包含过来,那么no1.c中调用add()函数的时候就可以了把数值传到no2.c中的被调用函数add()了。

一个文件必须要有main函数。 这句话错了。 例如:no2.c就没有。

头文件一定是以.h结束的。 这句话错了。例如:no1.c中就是#include”no2.c”以.c结尾的。

13)指针迷惑的考点:

问你 *(p+2) 和 *p+2的结果是多少?

‘m’ ‘k’ 结果是这两个,想不通的同学请作死的想!想通为止!

14)数组中放数组一定要看懂:

b[a[3]]++ 这个写法要看懂,结果要知道是什么?b[4]++,本身是0,运行完后,b[4]为1了。

C语言中没有字符串变量,所以用数组和指针存放字符串:

16)字符串赋值的函数背诵:一定要背诵,当心笔试填空题目。

把s指针中的字符串复制到t指针中的方法

17)typedef 是取别名,不会产生新的类型,他同时也是关键字

18)static 考点是一定会考的!复习相关的习题。

int x:默认值为不定值。

19)函数的递归调用一定会考!至少是2分。

自右向左:单目运算符,条件运算符,赋值运算符。

版权声明:本文为CSDN博主「网世侠客」的原创文章,

我要回帖

更多关于 vb数组赋值 的文章

 

随机推荐