很多时候难住我们的并不是复杂问题,而是很简单的简单问题。基本上都不会被任注意的那种小问题。小编最近就深刻感受到原来简单问题的盲点还是因为不会。
问题1:C语言程序的执行过程。
首先从小编接触C语言,编译好程序后直接点击运行,有问题调试,然后得出想要的结果就好了,从来没有在意过怎么执行的,只是将概念过来一遍就认为完成想要的操作。但是正式这些很不起眼的点反映出了学东西的不牢固。
就比如说**#include<stdio.h>**,谁会管这个源代码是啥,直接用多简单,但是真的去看看这个源代码,真的好难。。这个库差不多有2500行代码,而且是啥咱也看不懂,可能小编后期就看懂了吧。今天小编先来说说这个程序的运行到达成为一个可执行文件需要经历的过程。
首先说明:不管你是用C语言 Java C++写的代码,机器看不懂。
这就需要有环境将代码转换成为计算机能看得懂得代码环境,在实现时,存在2种环境,**翻译环境和执行环境。**
- 翻译环境
在这个环境中,源代码被转换成为可执行的机器指令
翻译执行时,组成程序的源文件会被编译成目标代码,然后各个目标文件通过链接器捆绑在一起,形成一个单一而完整的可执行程序。
编译
首先进行预处理过程,预处理器在源代码上进行一些文本操作。例如:#include指令包含的头文件。
解析
判断语句意思,这里也是产生绝大多数错误和警告的地方。随后便产生了目标代码。目标代码再经过优化器进行优化,目标代码是以汇编语句的形式存在,然后经历独立的阶段编译成为目标文件。 - 执行环境
执行代码,标准明确说明,这两种环境不必要位于同一台机器上
程序在执行前首先要载入内存中,在操作系统中完成。然后在操作系统中通常一个小型的启动程序与程序链接在一起,处理一切。例如收集命令行参数一遍程序使用访问。然后调用main()函数。现在开始执行程序代码,在绝大多数机器中程序将使用一个运行时堆栈,用于存储函数的局部变量和返回地址,同时也用静态内存,存储于静态内存中的变量在程序中的整个执行过程中将一直保留他们的值。
最后一个阶段就是程序终止。可以是很多原因。
正常情况下就是main 函数返回,程序也可能是因为错误中断。
小提示
数组名称是什么?
数组我们经常用,但是数组名称到底是什么?书上讲的是数组名称是数组元素的首地址,但是我们知道数组是线型的,只不过可以将线性的空间表达成为很多维度。一维数组名称是指向该线性的空间的首地址,二维数组名称也是指向二维数组线型空间的首地址。那么怎么来区分一维数组和二维数组?这就需要使用指针的类型。如果认为以为数组和二叔数组名称的类型相同,都是一级指针,那么计算机就会无法区分以为数组和二维数组。我们来看下简单的几行代码反应出二维数组的数组名称的指针类型。
int arr[3];
int arr1[3][3];
int* *p1 = arr1;
printf("%p ", arr);
printf("%p ", arr1);
printf("%p ", p1);
打印结果如下
00CFF760 00CFF734 00CFF734 也就是说这个数组名称相当于是二级指针 p1, 但是怎么理解呢?数组名称是指向首行的首元素,在指向首行的时候就应该有指针记录,首行的首元素也就是指针的指针也就是一个二级指针。因此,千万不要小瞧了简单的知识点,一旦涉及盲点,只能说自己没学好,不能说面试官问题刁钻。