文章目录
- ==祝大家在努力的路上,以梦为马,砥砺前行 ------ 共勉
本笔记阅读声明
前言:笔记是参照牟海军的《C语言进阶·重点难点与疑点解析》所作,主要是代码的编写和知识归类,C语言小白可以查看我的C语言基础专栏学习,然后再来参照我的笔记
牟海军资深C语言开发工程师,钟爱C语言,对C语言有较深入的理解和研究,实践经验较为丰富;喜欢研究算法,谙熟各种常见算法和经典算法,颇有心得;擅长嵌入式Linux开发,以及使用Qt进行嵌入式开发;活跃于CSDN等技术社区,是CSDN的推荐博客专家
- 本笔记会不断更新 ~给自己的期限是两个月
- 整篇笔记代码实现后使用的编译器是gcc ------->与之相关的编译命令在我的博客里面也有介绍
笔记包含相关知识点对应的书中代码,都会一一粘贴进去,至于解释图,我要有时间就加进去
本笔记阅读对象
- C语言爱好者
- 嵌入式开发人员
- 初、中级C语言程序员
- 参加C语言培训的学员
如何阅读本笔记
笔记对应书籍分11个章节来书写
- 第1章主要是针对C语言学习中容易混淆的核心概念进行具体讲解,初学者读起来可能有点吃力,建议去我的C语言基础栏目简单了解一下C语言,了解过还没看懂的,可以跳过,从第二章开始学习。
- 第2~8章有针对性的对知识点进行具体记录,阅读者可以通过这几章的学习夯实基础。
- 第9章重点讲解C语言编程中进行调试和异常处理的常见方法和技巧。
- 第10章重点讲解C语言编程中的一些陷阱知识点,通过学习编程时可以绕过这些陷阱。
- 第11章讲解了编程时的常用算法,这是编程中必然遇到的,所以希望大家可以动手编程实现一下
----------------------------------- 开始喽! -------------------------------------
----- 加油撸代码吧!!! -------------编程进阶之路就此开始----------
第1章 理清核心概念
1.1 堆栈
等待更新中~~~~~~~~~~~~~~~~~~~~~~~~~~
1.2 全局变量和局部变量
1.全局变量(也叫外部变量)分为外部全局变量(extern修饰)和静态全局变量(static修饰)
2.静态全局变量(static修饰)------只能在被定义在的源程序使用,而外部全局变量(extern修饰)既可在被定义在的源程序使用,也可以在别的源程序的函数引用
3.在函数前定义过全局变量,那在这个函数里面使用时,可以不说明,通常要在函数前做全局变量做说明
例如:
#include<stdio.h>
int a = 0;
void print()
{
printf("global variable a=%d\n",a);
}
int main()
{
print();
return 0;
}
全局变量a在print()函数前有定义,所以在print()函数中使用无需说明,但下面的代码将会运行出错。
#include<stdio.h>
void print()
{
printf("global variable a=%d\n",a);
}
int a = 0;//全局变量没有在print()前声明
int main()
{
print();
return 0;
}
可以在print()函数里面的printf()语句前加一个 extern int a;
4.局部变量是相对于全局变量来说的,局部变量就是定义在函数体里面的变量。当然,由于形参相当于函数中定义的变量,所以形参也属于一种局部变量。
1.3 生存期和作用域
1.3.1 生存域
注:1.生存期不是变量离开它的作用域,它的生存期就结束。
2.所谓生存期:指占用内存或者寄存器的时长。
3.根据变量存储类型不同,在编译的时候,变量将被存在动态存储区或静态内存区,所以生存期是由声明类别所决定的,声明在哪个存储区就被存储在哪个区
4.存储区介绍
-
静态存储区,存放函数里的全局变量和静态变量,在程序执行前分配好存储空间,占据固定的存储单元。
-
动态存储区,存放函数里的局部变量、返回值、形参等,在函数执行过程中进行动态分配,在执行完该函数时自动释放。因此函数每次被调用,临时变量的地址可能不同。
-
存储类别和相应的变量介绍
- (1)自动(auto)
非静态变量的局部变量即为自动变量,类型说明符是auto,无说明符就默认为自动(auto)
void print()
{
int a;
}
等价于
void print()
{
auto int a;
} - (2)寄存器(register)
指定register存储类别的变量即为寄存器变量。寄存器变量可以提高执行效率。在内存单元存取变量相比从寄存器中存取要耗时,register声明的寄存器类别变量存储放在寄存器中,不占用内存单元,可提高程序执行效率。注:只有局部变量才能被存储为此类型。 代码对比:
a.不使用register:
#include<stdio.h> #include<sys/time.h> int main(int argc,char* argv[]) { struct timeval start,end; gettimeofday(&start,NULL);/*测试起始时间*/ double timeuse; double sum; int j,k; for(j=0;j<1000000000;j++) for(k=0;k<10;k++) sum=sum+1.0; gettimeofday(&end,NULL);/*测试终止时间*/ timeuse = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec; timeuse /= 1000000; printf("运行时间为:%f\n",timeuse); return 0; }
运行结果:运行时间为:29.517167
b.使用register:
#include<stdio.h> #include<sys/time.h> int main(int argc,char* argv[]) { struct
- (1)自动(auto)