作者:郭孝星

微博:郭孝星的新浪微博

邮箱:allenwells@163.com

博客:http://blog.csdn.net/allenwells

Github:https://github.com/AllenWells

一 基本概念

1.1 关键字static的作用

  1. 在函数体。一个被声明为静态的变量在这一函数被调用的过程中维持其值不变。
  2. 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用的函数调用,但不能被模块外的其他函数訪问。它是一个本地的全局变量。
  3. 在模块内,一个被声明为静态的函数仅仅能够被这一模块内的其他函数调用。那就是这个函数被限制在它的模块的本地范围内使用。

1.2 引用和指针的差别

  • 引用变量必须初始化,指针不必。

  • 引用初始化以后不能被改变。指针能够改变所指的对象。
  • 不存在指向空值的引用,可是存在指向空值的指针。

1.3 #include

1.4 全局变量和局部变量在内存中存放位置的差别

全局变量存放在静态区中,局部变量存放在堆栈中。

1.5 堆栈溢出的原因

  • 没有回收垃圾资源。

  • 层次太深的递归调用。

1.6 引用一个已经定义过的全局变量

  • 引用头文件的方式。假如定义的那个变量出错,那么编译器就会报错。
  • 用extern关键字方式引用。假如定义的变量出错,则编译器间不会报错,而在连接期间报错。

1.7 全局变量能否定义在多个.c文件包括的头文件里

能够。在不同的.c文件里以static形式来声明同名全局变量。前提是当中仅仅能有一个C文件对此变量赋初值,此时连接时不会出错。

1.8 for( ; 1 ; )是什么意思

和while(1)同样,无限循环。

1.9 static 全局变量、局部变量、函数与普通全局变量、局部变量、函数

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式,两者在存储方式上并无差别。而非静态全局变量在各个源文件里都是有效的。而静态全局变量则仅仅在定义该变量的源文件有效。static全局变量值初始化一次,防止在其他文件单元中被引用。

因此,把局部变量改成静态变量后改变了它的存储方式即该变了它的生存期。而全局变量改成静态变量后改变了它的作用域,限制了它的使用范围。

static局部变量仅仅初始化一次,下一次根据上一次的结果值。

static函数与普通函数的作用域不同,仅在本文件。仅仅在当前文件里使用的函数应该说明为内部函数。static函数在内存中仅仅有一份。普通函数在每一个调用中都维持一份拷贝。

1.10 程序的内存分配

  • 栈区(stack):由编译器自己主动分配释放,存放函数的參数值。局部变量的值,其操作方式相似于数据结构中栈。
  • 堆区(heap):一般由程序猿分配释放。若程序猿不释放, 程序结束时可能有操作系统回收。它与数据结构中的堆是不同的。其分配方式相似于链表。
  • 全局区(静态区static):全局变量和静态变量的存储是是放在一块的。

    初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量放在响铃的还有一块区域。

  • 文字常量区:存放常量的字符。程结束后由统释放。
  • 程序代码区:存放函数体的二进制代码。

举例

int a = 0;        //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;
char s[] = “abc”; //栈
char *p2; //栈
char *p3 = “123456”;
static int c = 0; //全局初始化区
p1 = (char *)malloc(10);
p1 = (char *)malloc(10); //分配分配得来10和20字节区域在堆区
strcpy(p1, “123456”); //123456\0放在常量区。编译器可能将它与“1223456”优化成一个地方。 }

1.11 堆和栈的差别

申请方式

  • 栈:由系统自己主动分配。

- 堆:由程序猿申请,并指明大小。

C:p1 = (char *)malloc(10);
C++:p2 = (char *)malloc(10);

注意:p1和p2本身是在栈中。

申请后系统的响应

  • 栈:仅仅有栈的剩余空间大于申请的空间。系统将为程序提供内存,否则将提示栈溢出。
  • 堆:首先系统中会有一个记录空暇内存地址的链表。系统受到程序的申请时会编立该链表,寻找第一个空间大于所申请的堆结点,并把该结点的空间分配菲程序。

    同一时候,系统会在这块内存空间的首地址记录本次分配的大小,这样delete语句才干正确的释放本内存空间。

    另外。由于找到的堆结点的大小并不一定正好等于申请的大小,系统会自己主动的将多余的那部分又一次放入空暇链表中。

1.12 指针数组与数组指针

int(*p)[4],这个就是行指针这样的类型的指针p是指向一个一维数组。这个一维数组包括4个整形元素。

可是 int a[4];p=a; 这样的方式却是不正确的由于p仅仅能指向一个整型的一维数组,不能指向一个整型数据,a所指向的正是a[0]。是个整型数。

实际上int(*p)[4]这样的类型的指针是用于多维数组中的。比方定义一个二维数组int b[3][4],就能够这样赋值p=&b[0],使p指向一维数组b[0],并且p的增减是以一维数组的长度为单位的,比方p+1指向的就是b[1]了

int *p[4]这个是指针数组了,首先弄明确这个是数组,里面存放的是指针也就是地址。这个地址所指向的是一个整型数据。你能够把p[0],p[1]….当作一个个的指针变量来使用。

C语言重要概念汇总的更多相关文章

  1. C语言面试题汇总之一

    C语言面试题汇总之一 1.static有什么用途?(请至少说明两种) l 限制变量的作用域: 设置变量的存储域. 2.引用和指针有什么区别? 引用必须被初始化,指针不必: 引用初始化以后不能被改变,指 ...

  2. Java 算法 概念汇总

    编程面试的10大算法概念汇总   以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java ...

  3. 001_C/C++笔试题_考察C/C++语言基础概念

    (一)文章来自:C/C++笔试题-主要考察C/C++语言基础概念.算法及编程,附参考答案 (二)基础概念 2. 头文件中的ifndef/define/endif的作用? 答:防止该头文件被重复引用. ...

  4. 【Java】 语言基础习题汇总 [1] 基础概念到数组

    1 JDK JRE JVM 三种之间的关系,以及JDK JRE 包含的主要结构有哪些? JDK = JRE + 开发工具 javac.exe java.exe javadoc.exe等等 JRE = ...

  5. JAVA理论概念大神之概念汇总

    我个人觉得,JAVA之所以能够经久不衰,有一个很重要的原因就是:JAVA的理论总是给人一种,虽然不知道是什么,但是感觉很厉害的样子.就单是这一点,他就已经超越许多其他语言了,至少吹牛的时候谈资总是很多 ...

  6. [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)

    本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...

  7. 《C语言程序设计现代方法》第2章 C语言基本概念

    C语言的基本概念 第一个C程序例子. /* pun.c */ #include <stdio.h> int main(void) { printf("To C, or not t ...

  8. Golang 入门系列(三)Go语言基础知识汇总

    前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...

  9. R语言常用包汇总

    转载于:https://blog.csdn.net/sinat_26917383/article/details/50651464?locationNum=2&fps=1 一.一些函数包大汇总 ...

随机推荐

  1. topK问题解法

    topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题. 堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆 ...

  2. 《Java性能权威指南》笔记----Java性能调优工具

    OS 1.CPU 用户态时间(us):cpu执行应用代码所占时间的百分比. 内核态时间(sy):cpu执行内核代码所占时间的百分比,系统态时间与应用相关. 空闲时间(id):cpu空闲时间百分比.空闲 ...

  3. PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码

    在用PowerDesigner时.常常在NAME或Comment中写中文在Code中写英文.Name只会显示给我们看,Code会使用在代码中.但Comment中的文字会保存到数据库TABLE的Desc ...

  4. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 2

    继续昨天的思路,今天先google了类似的实现domain0和domainU之间数据传输的方案 [Xen-devel] XenStore as a data transfer path?  这篇帖子讨 ...

  5. [SaltStack] salt-master启动流程

    SaltStack源码阅读 做salt有一段时间了, 一直没从源码层面去理解, 好吧, 开始读读源码 -_- 那就从salt-master的启动开始吧. 启动salt-master方法: /etc/i ...

  6. 在typescript中import第三方类库clipboard报错

    一.问题 在实际开发项目中就遇到了这样的问题,需要在Vue+Typescript项目中添加复制文本的功能,就找了clipboard插件,先是新建了一个新的项目用来实验看看是否好用,都写好了以后发给别人 ...

  7. 10.1综合强化刷题 Day2 afternoon

    最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的 ...

  8. luogu P1314 聪明的质监员

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...

  9. NOI模拟题6 Problem C: Circle

    Solution 首先这个矩阵, 很明显的就是Vandermonde矩阵. 我们有公式: \[ |F_n| = \prod_{1 \le j < i \le n} (a_i - a_j) \] ...

  10. 批处理备份mysql数据

    客户服务器,需要每天定时备份数据库,没办法,bat走起! 代码如下: @echo off C: cd C:\***\***\mysql\bin set Ymd=%date:~,4%%date:~5,2 ...