![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 72
CMbug
这个作者很懒,什么都没留下…
展开
-
【C语言复习(二十四)】C语言程序内存结构总结
详细资料请参考:【C语言复习(二十一)】C语言程序的存储区域【C语言复习(二十二)】C语言程序的内存段【C语言复习(二十三)】C语言程序中段的使用 根据前三篇文章的介绍,这里做一个简单的总结1、三国天下一个C语言程序在运行时,内存结构分为:全局静态区、动态区;动态区又包括:堆区、栈区;全局静态区:程序运行过程中始终存在,运行结束后由操作系统释放,全局静态区里的大原创 2014-06-23 11:00:29 · 765 阅读 · 0 评论 -
【C语言复习(二十三)】C语言程序中段的使用
3.2.2 程序中段的使用本小节使用简单的例子,说明C语言中变量和段的对应关系。C语言程序中的全局区(静态区),实际对应着下述几个段:只读数据段:RO Data读写数据段:RW Data未初始化数据段:BSS Data一般来说,直接定义的全局变量在未初始化数据区,如果该变量有初始化则是在已初始化数据区(RW Data),加上const修饰符将放置在只读区域(RO Data)。转载 2014-06-22 22:42:53 · 1002 阅读 · 0 评论 -
【九】栈与递归--程序栈空间
1、C语言中的疑惑C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?解答:保存局部变量的栈是函数调用时的栈;程序中的“函数调用栈”是栈数据结构的一种应用;函数调用栈一般是从高地址向低地址增长的 栈底为内存的高地址处栈顶为内存的低地址处函数调用栈中存储的数据被称为活动记录2、什么是活动记录?活动记录是函数调用时一系列相关信息的记录,猜测它应该原创 2015-05-27 20:54:26 · 2872 阅读 · 0 评论 -
【十】递归
1、什么是递归?递归是一种数学上分而自治的思想递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理递归需要有边界条件 当边界条件不满足时,递归继续进行当边界条件满足时,递归停止2、利用递归,实现斐波拉契数列什么叫斐波那契数列? 又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 即第n项是第n-1项与第n-2项的和;完整代码:/* 该函数利原创 2015-05-27 21:32:51 · 760 阅读 · 0 评论 -
【C语言复习(四)】指针基础
1、什么是指针?首先,回顾一下什么是变量?所谓程序变量,只是程序运行时某一段内存空间的别名,通过它可操作此段内存空间,但这不是唯一操作此段内存空间的办法,通过指针就是一个不错的选择!示例:#include int main(){ int i=50; int* p=&i; printf("%d\t%08X\n",i,p); *p=100;原创 2014-06-14 22:42:14 · 811 阅读 · 0 评论 -
【C语言复习(十一)】#pragma编译指示字相关使用
1、它是什么??#pragma是编译器指示字,用于指示编译器完成一些特定的操作;#pragma所定义的很多指示字是编译器和操作系统特有的,不同平台、不同编译器支持的会有不同;#pragma指示字不在预编译阶段被处理,它的处理在编译阶段!#pragma在不同编译器之间不可移植预处理将它不认识的#pragma指令忽略两个不同的编译器可能以两种不同的方式解释同一条#pragma指原创 2014-06-12 23:54:24 · 1584 阅读 · 0 评论 -
【C语言复习(三)】enum、typedef 和#define的分析与区别
1、enumenum关键字用来定义一种自定义类型,称之为枚举类型,它的值会在定义时一一列举出来,用它定义的变量只限于列举出来的值的范围内;例如:enum Color{ red,yellow,blue,white,black}; 花括号中的值成为枚举元素或枚举常量,枚举类型的枚举元素在C中被当作常量处理,不能对其赋值,每一个枚举元素都代表一个整数,不能为浮点数等原创 2014-06-12 16:09:36 · 1095 阅读 · 0 评论 -
【C语言复习(十八)】数组参数和指针参数
1、退化的意义在【C语言复习(十三)】数组和指针的第6小点中有说到,数组在作为函数参数时会退化为一个指向数组元素的指针,那么为什么C语言中的数组参数会退化为指针??原因可能如下:C语言中只会以值拷贝的方式传递参数;不管是传值操作还是传址操作,其实本质上传递的还是值,这个概念在学过C++的朋友应该能明白,C++中就还有一个引用传递,传递的是地址(实参为变量名,形参为变量的引用,接收的原创 2014-06-19 11:21:11 · 1242 阅读 · 0 评论 -
【C语言复习(十七)】多维数组和多维指针
1、指向指针的指针指针变量在内存中会占用一定的空间,既然占用空间,那么就有地址,即是可以定义另外一个指针来保存当前指针的地址值;#include int main(){ int a=50; int* p=NULL; int** pp=NULL; pp=&p; *pp=&a; return 0;} 为原创 2014-06-18 19:06:20 · 1201 阅读 · 0 评论 -
【C语言复习(二十七)】野指针和内存操作分析
1、初识野指针 野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的;野指针不是NULL指针,是指向不可用内存的指针;NULL指针不容易用错,因为if语句很好判断一个指针是不是NULL;2、野指针的由来局部指针变量没有被初始化使用已经释放过后的指针指针指向的变量在指针之前被销毁3、常见错误分析3.1 非法内存操作结构体成员原创 2014-06-24 18:10:42 · 742 阅读 · 0 评论 -
【C语言复习(二十八)】函数本质、顺序点
函数本质1、函数的意义大概也就是模块化程序设计吧....在面向过程是一种以过程为中心的编程思想,首先将复杂的问题分解为一个个容易解决的问题,分解过后的问题可以按照步骤一步步完成,每一步都使用一个独立的函数来实现,函数是面向过程在C语言中的体现。 2、函数的声明和定义函数的声明和定义是不一样的,函数声明只是预先告诉编译器有这么一个东西存在,只是还没有具体定义;而函数定义是具体原创 2014-06-25 11:01:51 · 793 阅读 · 0 评论 -
【C语言复习(八)】宏定义的使用与分析
1、宏常量#define定义的宏常量可以出现在代码的任何地方,但为了美观易读,通常都写在开头#define从定义行开始,后面均可使用此宏定义2、宏表达式#define表达式给人有函数的假象,但绝对不是函数#define表达式有时可以比函数更强大#define表达式比函数更容易出错,应谨慎使用案例分析:试着分析如下程序:#include #de原创 2014-06-12 16:52:45 · 1283 阅读 · 0 评论 -
【C语言复习(九)】条件编译的使用与分析
1、基本概念:条件编译的行为类似于if...else语句,只是在条件编译中,满足条件的才会被保留下来以备编译。条件编译是预编译指示命令,用于控制是否编译某段代码。 示例:#include #define COMMAND 1int main(){ #if(COMMAND == 1) printf("COMMAND == 1");原创 2014-06-12 19:59:34 · 639 阅读 · 0 评论 -
【C语言复习(五)】由++,--操作符的使用简单认识C编译器的“贪心法”编译机制
C语言中自增和自减操作符的使用有时真的令人头疼,如果不知道编译器如何处理它们,就无法正确预计计算的结果。例如下面的例子: int i=3;int j=(++i)+(++i)+(++i); 第一次看到这段代码时,我觉得结果会是15,因为我想括号内的部分应该会被从左到右优先计算,那么结果就是4+5+6=15;可是在Gcc中编译运行的结果却是16;在Visual Stud原创 2014-06-12 16:17:12 · 1059 阅读 · 0 评论 -
【C语言复习(二十二)】C语言程序的内存段
接上一篇:《C语言复习(二十一)》此篇转载 2014-06-22 22:14:23 · 632 阅读 · 0 评论 -
【C语言复习(二十一)】C语言程序的存储区域
此部分内容,参看了嵌入式Linux上的C语言编程实践转载 2014-06-22 21:51:23 · 660 阅读 · 0 评论 -
【C语言复习(二十)】动态内存分配
1、为什么要使用动态内存分配?C语言中的一切操作都基于内存;变量和数组都是内存的别名,如何分配这些内存由编译器在编译期间决定:定义数组的时候必须指定数组长度;数组长度在编译期就必须决定;由于以上的限制,如果在程序运行时,一旦预先定义的数组大小不够使用,那就需要重新分配内存大小,这就要使用动态内存分配。2、C语言内存管理函数 函数名原创 2014-06-20 10:57:15 · 841 阅读 · 0 评论 -
【C语言复习(二十六)】各个目标文件的关系
程序中通常会有大量的函数调用,这些被调用的函数只要有声明(而不需要定义实现),编译器就可以成功处理。在生成可执行文件的过程中,连接器将各个可执行程序的代码段组合到一起,而有函数调用的地方还需要找到真正的函数定义才可以完成连接。因此,函数的定义和调用者可以在一个代码段内,也可以在不同的代码段内。连接器会根据需要根据实际的情况修改编译器生成的机器代码,完成正确的跳转。函数跳转的连接过程如图13转载 2014-06-24 15:07:28 · 847 阅读 · 0 评论 -
【C语言复习(二十五)】可执行程序的组成
13.3.1 可执行程序的组成上一节分析了C语言应用程序中各段的情况,实际的C语言可执行程序,将由各个文件经过连接生成。目标文件是由每一个C语言源程序(*.c)经过编译器生成,目标文件(.o)的主要组成部分即代码段、只读数据段和读写数据段三个段。未初始化数据段、堆和栈不会占用目标文件的空间。可执行程序是由各个目标文件经过连接而成。其主体部分依然是代码段、只读数据段和读写数据段,这三转载 2014-06-24 15:00:42 · 1054 阅读 · 0 评论 -
【C语言复习(三十)】函数的调用行为
函数的调用行为1、关于活动记录活动记录是函数调用时用于记录一系列调用相关信息的记录,大概有如下几个内存域:临时变量域:用来存放临时变量的值,如顺序点求值中k++的中间结果局部变量域:用来存放函数本次执行中的局部变量;机器状态域:用来保存调用函数之前有关于机器的状态信息、包括各种寄存器的当前值和返回地址等;实参数据域:用于存放函数的实参信息;返回值域:为调用者函数存放返回原创 2014-06-26 11:41:31 · 793 阅读 · 0 评论 -
【C语言复习(一)】auto、static、register、const、volatile关键字的分析
首先,C语言中的变量可以有自己的属性,这些属性用于赋予变量特定的含义;本篇中分析的属性关键字有以下三个:auto、static、register1、autoauto是C语言中局部变量默认的属性,可不用显式指定,编译器在编译前都会默认加上;用auto关键词修饰的变量会在栈上分配空间,而全局变量会在程序的全局静态存储区分配空间,所以,auto关键字不能用在全局变量前面,否则会出现矛原创 2014-06-12 15:51:10 · 968 阅读 · 0 评论 -
【C语言复习(七)】编译过程的简介
1、被隐藏的编译过程:2、编译过程:(1)预编译:· 处理所有的注释,以空格代替;· 将所有的#define删除,并展开所有的宏定义· 处理条件编译指令:#if,#ifdef,#elif,#else,#endif· 处理#include,展开包含的头文件· 保留编译器需要使用的#pragma指令(2)编译:· 对预处理后的文件进行一系列词法分析、语法分析和语原创 2014-06-12 16:28:23 · 827 阅读 · 0 评论 -
【C语言复习(十)】#error与#warning、#line、#与##的简单使用
1、#error的用法#error编译指示字用于生成一个编译错误消息,并让预编译器停止编译,这个错误消息是开发人员自定义的。用法:#error Message (Message不需要用双引号引起来)2、#warning的用法#warning编译指示字用于生成一个编译警告,输出到编译器的消息窗口,当编译器不会停止编译。用法:#warning Message (Message原创 2014-06-12 21:13:52 · 4969 阅读 · 0 评论 -
【C语言复习(六)】隐式类型转换相关分析
C语言中可以做隐式类型转换,不需要我们明确指明,这点很方便,当有时候也带来隐性的问题。先看看C语言中隐式类型转换的规则:1)、算术运算式中,低类型转换为高类型;类型的高低参考下图:2)、赋值表达式中,表达式的值转换为左边变量的类型;例如: int i=0;char c=’a’;i=c;//这里的变量c会被转换成int类型,值为‘a’的ASCII码3)、函数调原创 2014-06-12 16:24:32 · 1238 阅读 · 0 评论 -
【C语言复习(二)】struct 与 union 的分析
C语言中,struct 与 union 关键字都是用来定义用户自己的数据类型,struct用来定义结构体,union用来定义共用体;一个结构体所占用的内存空间等于它的成员所占空间的总和;一个共用体所占内存空间等于它的成员中占用空间最大的成员所占的空间大小,同一时刻,只能有一个成员出于有效状态! 1、struct(1)、思考:一个空的结构体,占用多大内存空间??如下示例:#inc原创 2014-06-12 16:05:07 · 1305 阅读 · 0 评论 -
【C语言复习(十二)】数组基础
1、数组的概念数组是相同类型的变量的有序集合;如int num[5];002、数组地址与数组名数组名代表数组首元素的地址;数组的起始地址需要使用取地址符&才能得到;数组首元素的地址值与数组的起始地址值相同,但却是不同的两个概念,如上图中所示;3、数组名数组名通常可以看作是一个常量指针,即它不能作为左值被赋值,只能作为右值赋值给其他变量;数组名“指向”的是内存原创 2014-06-15 17:50:16 · 889 阅读 · 0 评论 -
【C语言复习(十三)】数组和指针
数组基础1、数组的概念数组是相同类型的变量的有序集合;如int num[5];002、数组地址与数组名数组名代表数组首元素的地址;数组的起始地址需要使用取地址符&才能得到;数组首元素的地址值与数组的起始地址值相同,但却是不同的两个概念,如上图中所示;3、数组名数组名通常可以看作是一个常量指针,即它不能作为左值被赋值,只能作为右值赋值给其他变量;数组名“指原创 2014-06-16 12:55:49 · 711 阅读 · 0 评论 -
【C语言复习(十四)】C语言中的字符串
字符串及其相关函数1、C语言中的“字符串”严格来讲,C语言中不存在字符串数据类型,都是以字符数组来模拟字符串的;C语言中字符串是以’\0’结束的字符数组;C语言中的字符串可以分配于栈空间、堆空间、或者只读存储区;如下示例:#include #include int main(){ char str1[]={'H','e','l','l','o',' '原创 2014-06-16 19:25:25 · 655 阅读 · 0 评论 -
【C语言复习(十五)】数组指针和指针数组
数组指针和指针数组1、简单的思考看如下代码: int array[5]; int matrix[2][3]; int* pa=array;int* pb=matrix;思考问题:都知道,一位数组名array代表数组首元素地址,那么二维数组名matrix代表什么?也是首元素地址么?array和&array的值相同,它们的意义不同,表现在它们的指针原创 2014-06-17 21:38:36 · 702 阅读 · 0 评论 -
【C语言复习(十六)】main函数及其参数
main函数及其参数 1、简介C中的主函数为main(),它是程序的入口,可以理解为被操作系统调用的函数;在执行程序时,可以向main函数传递参数,通常有以下几种:int main()int main(int argc)int main(int argc,char *argv[])int main(int argc,char *argv[],char *env[])原创 2014-06-17 21:44:09 · 891 阅读 · 0 评论 -
【C语言复习(十九)】函数与指针
1、函数的类型C语言中函数有自己特定的类型函数类型由返回值、函数参数、参数个数共同决定:例如:int func(int i,int j);类型为:int(int,int)C语言中通过typedef为函数类型重命名:typedef type name(parameter list)例如:typedef int INT(int,int) 2、函数指针函数指针用原创 2014-06-19 22:24:00 · 733 阅读 · 0 评论 -
【C语言复习(二十九)】可变参数的函数
1、可变参数简介C语言中可以定义参数可变的函数;参数可变函数的实现依赖于stdarg.h头文件va_list变量与va_start、va_end、va_arg配合使用能够依次访问参数值; 示例:不定个数的数据的平均值:#include #include float average(int n, ...){va_list args;//接收可变参数,原创 2014-06-26 10:21:01 · 564 阅读 · 0 评论