C Language
回归技术的本质
这个作者很懒,什么都没留下…
展开
-
单向链表
#include #include /********链表节点********/struct student{ long num; float score; struct student *next;};typedef struct student TYPE;int node_num; /*记录链表中节点数*/#define LEN sizeof(TYPE) /*链表节点长度*//*==================原创 2011-01-06 17:03:00 · 883 阅读 · 0 评论 -
malloc、calloc、realloc的区别
(1)C语言跟内存分配方式从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.从堆上分配,亦称动态内存分配. 程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态原创 2011-01-15 01:08:00 · 86981 阅读 · 19 评论 -
const用法小结
语法格式: const 类型名 常量名=常量值(表达式); 作 用: 定义时初始化,之后不可修改,不可以函数返回值进行初始化.const修饰符可以保证程序的健壮性. 使用方法: const修饰符常和指针联合使用.const 是一个左结合的类型修饰符,它与其左侧的类型修饰符合为一个类型.切记,当const放在指针符*左侧,则表示修饰的是指针内容.当const放在指针符*右侧,则表示修饰的是指针本身.注意,若某变量使用const修饰后,编译器会查找该变量在应用程序中是否发生变原创 2011-01-13 19:42:00 · 2117 阅读 · 0 评论 -
指针的强制类型转换
假定CPU是小端格式,求下面代码的输出结果. int main(int argc, char* argv[]) { int i; char Data[100]; short Out; for(i=0;i【attention】 这段代码考察的是指针类型的强制转换问题. for循环结束后,Data[0]-Data[5]的值分别是0-5.指针Data是数组名,表示数组的首地址,它是指向char型数据的指针. (int *)Data: 将指向char型数据的指针强制转换为指向i原创 2011-01-16 15:28:00 · 2412 阅读 · 0 评论 -
Sleep函数
函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 在VC中使用带上头文件 #include 在gcc编译器中,使用的头文件因gcc版本的不同而不同 #include 注意 在VC中Sleep中的第一个英文字符为大写的"S" 在标准C中是sleep, 不要大写.下面使用大写的来说明,具体用什么看你用什么编译器. 简单的说VC用Sleep, 别的一律使用sleep.原创 2011-01-18 11:53:00 · 2119 阅读 · 0 评论 -
局部变量、全局变量和静态变量的含义
(1)局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量. 1.主函数main中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效. 2.不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰. 3.形式参数也使局部变量. 4.在一个函数内部,可以在复合语句中定义变量,这些变量只在本符合语句中有效.(2)全局变量 在函数外定义的变转载 2011-01-18 17:15:00 · 8800 阅读 · 0 评论 -
浮点数
写出float x 与“零值”比较的if语句. 答: if(x>0.000001&&x 【attention】不可将浮点变量用"=="或"!="与任何数进行比较. 根据学生分数来显示学生信息 #include #define EPSINON 1e-6 //允许的误差 typedef struct student { int id; char name[20]; float原创 2011-01-19 23:36:00 · 783 阅读 · 0 评论 -
C语言实现库函数
(1)C语言实现库函数:strcpy() char *strcpy(char *strDest ,const char *strSrc) { if((strDest==NULL)||(strSrc==NULL)) { return NULL; } char *strDestCopy = strDest; while((*strDest++=*strSrc++) != '/0'); return strDestCopy; }【atte原创 2011-01-18 16:52:00 · 1963 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)--- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2、堆区(heap)--- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收.注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3、全局区(静态区)--- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,转载 2011-01-18 17:23:00 · 2795 阅读 · 0 评论 -
双向循环链表
<br />#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <windows.h> /**********双向链表节点**********/ typedef struct student { int num; float score; struct student *prior; struct studen原创 2011-01-18 14:21:00 · 2733 阅读 · 0 评论 -
c语言中可变参数的原理---printf()函数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 在printf()函数中,format后面的参数个数不确定,且类型也不确定,这些参数都存放在栈内.当调用printf()函数时,根据format里的格式("%d %f...")依次将栈里的参数取出.而取出的动作要用到va_arg、va_end、va_start这三个宏定义,再加上va_list.原创 2011-01-15 00:21:00 · 5368 阅读 · 0 评论 -
C++中new和malloc的区别
1、new 是c++中的操作符,malloc是c 中的一个函数 2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数 3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。 4.new可以看成两个动作:1。分配内存(相当于malloc)2。引发构造函数。 new 是个操作符,和什么"+","-","="...转载 2011-01-14 00:13:00 · 2291 阅读 · 1 评论 -
c语言内存分配
<br /> <br />(1)代码段(text segment)<br /> 加载的是可执行文件的代码段,即存放CPU执行的机器指令(machine instructions).通常,代码段可共享(即另外的执行程序可以调用它),使其可共享目的是对与频繁被执行的程序,只需要在内存中有一份即可.代码段通常是只读的,使其只读原因是防止程序意外的修改了它的指令.<br /> 代码段的指令包括操作码和操作对象.如果是立即数(即具体的数值,如250),将直接包含在代码中;如果是局部数据,将在运行时原创 2011-01-06 19:22:00 · 990 阅读 · 0 评论 -
C标准库和glibc
<br /> C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。要在一个平台上支持C语言,不仅要实现C编译器,还要实现C标准库,这样的实现才算符合C标准。不符合C标准的实现也是存在的,例如很多单片机的C 语言开发工具中只有C编译器而没有完整的C标准库.<br /> 在Linux平台上最广泛使用的C函数库是glibc,其中包括C标准库的实现,也包括本书第三部分介绍的所有系统函数。几乎所有转载 2011-01-06 19:24:00 · 1858 阅读 · 0 评论 -
双向链表
<br />#include <malloc.h> #include <stdio.h> /**********双向链表节点**********/typedef struct student { int num; float score; struct student *prior; struct student *next; }TYPE; int nod_num; //节点数#de原创 2011-01-11 15:32:00 · 708 阅读 · 0 评论 -
二级指针与指针数组的关系
<br />#include <stdio.h>void test(char *argv[]);int main(void){ char *argv[3]={{"abcdefg"},{"1234567"},{"q1w2e3r"}}; test(argv); /*调用指针数组时,可直接使用指针数组名*/ return 0;}void test(char *argv[]){ char **p=argv; /***测试1组***/ prin原创 2011-01-11 19:22:00 · 5951 阅读 · 2 评论 -
位域
在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息.那么,如何向一个字节中的一个或几个二进制位赋值和改变它的值呢?通常有两种方法: (1)通过位运算中的移位操作来实现对一个字节中某几个二进制位进行控制.但这种方法非常麻烦,容易出错. (2)通过C语言的"位域"来实现对一个字节中某几个二进制位进行控制.一、位域的概念 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称原创 2011-01-13 00:37:00 · 1469 阅读 · 1 评论 -
C预处理器标识
C预处理器标识: 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef原创 2011-01-13 18:20:00 · 816 阅读 · 0 评论 -
static用法总结
1.static 变量 静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。2.静态局部变量 静态局部变量属于静态存储方式,它具有以下特点:(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但转载 2011-01-13 19:25:00 · 1200 阅读 · 0 评论 -
关键字volatile
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是volatile变量的几个例子. 1)并行设备的硬件寄存器(如:状态寄存器) 2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3)多线程应用中被几个任务共享的变量 嵌入式系统程序员经常同硬件、中断、RTOS等等打原创 2011-01-13 22:16:00 · 659 阅读 · 0 评论 -
malloc、free与内存碎片
<br /> malloc和free大量使用后回造成内存碎片,那么这种碎片形成的机理是什么?如果机理是申请的内存空间大小(太小)所形成的,那么申请多大的区域能够最大限度的避免内存碎片呢(这里的避免不是绝对的避免,只是一种概率)? <br /> 内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用.产生内存碎片的方法很简单,举个例: <br /> 假设有一块一共有100个单位的连续空闲内存空间,范围是0~99.如果你从中申请一块内存,如10个单位,那么转载 2011-01-14 00:03:00 · 3669 阅读 · 0 评论 -
字节对齐
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下原创 2011-01-19 23:47:00 · 1023 阅读 · 1 评论