《C语言进阶·重点难点与疑点解析》第一章·笔记

  • ==祝大家在努力的路上,以梦为马,砥砺前行 ------ 共勉
本笔记阅读声明

前言:笔记是参照牟海军的《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
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值