有关C的问题

1. 程序源代码以C语言为例,是如何转换为可执行的代码(二进制代码或者说机器语言)?

C源代码 -> 预处理器 -> 编译器 -> 汇编器 -> 链接器 -> 转换为可执行的文件

1. C源代码经过预处理器其结果,还是C语言

2. 预处理器经过编译(句法,词义分析,代码的优化,代码生成),其结果是汇编代码

3. 汇编代码结过汇编器其结果是中间代码(.o),其本质上也是二进制代码

4. 中间文件(.o)经过链接器的链接, 最后生成可执行的文件。

2.C语言里比较灵活的一块内容是指针, 那么请谈谈你对指针的理解。

回答这个问题的思路:
1、什么是指针,指针的基本概念
2.指针的使用场景
3.结合具体的例子,来说明一个, 用指针来解决那些问题。
4.关于指针运算的问题。

3.C语言内存布局

Mou icon

1.代码区:主要是存放代码,也就是程序指令。这个区的数据是只读

2.数据区,已初始区,声明全局变量的时候,同时给出了值, 那么这个变量就会放到已初始化。未初始化区:BSS,对于这个区的变量, 默认情况下, 全部初始为0  

3.堆区:是程序员接触最多的区域。malloc函数就是从这个区来分配内存的, 这个区是从下往上扩展

4.栈区:是由系统来管理的内存区域。局部变量,函数调用也在这个区,先进后出。

5.命令参数及环境变量区

4.C语言中const 关键字的理解

a. 对于非指针变量的修饰 比int const关键字可以放到int 之前, 也可放到int之后, 如const int myInt; int const myInt;它们所表达的含义是一样的, 都是表示myInt是一个常量。 不能修改myInt的值。 我们推荐使用const int myInt;
b. 对于指针变量的声明, 有四种情况 以int * 为例
1
2
3
4
1. const int * pMyPointer
2. int const * pMyPointer
3. int * const pMyPointer;
4. const int * const pMyPointer

对于1、2两种情况, 所表达的含义是一样的, 表示指针指指向的内容不能修改。

对于第3种情况, 所表达的含义是说指针本身不能再指向其它地址

对于第4种情况, 表明指针指向的内容不能修改, 同时指针本身也没能再指向其它地址。

在继承语法中, 关于OC的方法调度机制

1、每一个对象,都有一个指针指向其类
2.当向对象发送消息, 对象准备执行方法的时候,它会先在当前对象对属的类中查找这个方法, 如果找到话就开始执行, 如果没有找到的话, 就去对象所属类的父类去查找, 如果找到就执行, 如果没有找到, 则会沿着继承链一层一层的向上去查找, 直到NSObject 类, 如果找到则执行, 如果没有找到, 则首先编译器会给出一个警告, 如果忽略了这个警告,则在运行时程序会崩溃。

在继承中, 子类对象是如何说父类声明的成员变量的?

在创建一个新类的时候, 其对象会首先从父类中继承成员变量, 然后添加自身的成员变量。

谈谈你对OC中self 和 super的理解?

1.self 首先他是一个指针。
2.当向对象发送消息, 对象去调用对应的方法的时候, 在调用方法中, 在这个方法里,隐藏传了一个指针, 这个指针就是self,这个self 代表的是调用这个方法的消息接收者。
3. 有时候, 我们需要在子类里显式的调用父的方法, 这个时候 super可以代表父类, 需要注意的是, 这个super不是指针,也不是成员变量, 而它只是编译器识别的指令, 主要就用于子类访问父类的内容。