C语言
qwertdsdf
这个作者很懒,什么都没留下…
展开
-
预处理命令-宏定义
无参宏定义:宏名后不带参数宏定义与宏展开只是一种简单的符号代换宏定义必须写在函数之外,其作用域为从宏定义开始到程序结束,可以用#undef 终止其作用域宏定义允许嵌套,在宏定义中可以使用已经定义的宏带参宏定义:在宏定义中的参数称为形参,在宏调用中的参数称为实参#include <stdio.h>#define MIN(x,y) (x>y)?x:yint main(){ ...原创 2018-07-06 10:02:12 · 673 阅读 · 0 评论 -
函数的递归调用
C允许一个函数调用其本身。这种调用过程被称作递归。递归一般可以代替循环语句使用。递归虽然使程序结构优美,但其执行效率却没有循环语句高。递归函数中必须包含可以终止递归调用的语句。//防止出现无限调用最简单的递归形式是把递归调用语句放在函数结尾,这中形式被称作尾递归。尾递归的作用相当于一条循环语句。 递归的优缺点:优点是为某些编程问题提供了最简单的解决办法缺点是递归算法会很快耗...原创 2018-07-20 15:14:19 · 1069 阅读 · 0 评论 -
预处理命令-条件编译
第一种形式:第二种形式:第三种形式:原创 2018-08-14 10:34:34 · 245 阅读 · 0 评论 -
一段代码
#include <stdio.h>#include <stdlib.h>#include <string.h>#pragma warning (disable:4996)typedef struct teacher { char name[20]; int age; char **student;}teacher;void teache...原创 2018-08-21 20:55:44 · 955 阅读 · 0 评论 -
ftell与fseek
fseek原型: int fseek(FILE *stream,long int offset,int whence);成功返回0,出错返回非0whence有三个值可以选择:SEEK_SET:文件开头SEEK_CUR:当前位置SEEK_END:文件结尾fseek(fp,0,SEEK_END) 将文件指针移动到文件结尾,然后再调用ftell可以求得文件的长度。 ft...原创 2018-09-03 22:16:07 · 961 阅读 · 0 评论 -
结构体和共用体的内存对齐
编译器按照成员列表的顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员时间才可能出现用于填充的额外内存空间。系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始位置必须是结构中边界要求最严格的数据所要求的位置。这段话来自 C和指针,意思是存储结构体变量的地址必须是结构体最长元素的整数倍。结构体嵌套结构体时的...原创 2018-09-09 11:07:50 · 863 阅读 · 0 评论 -
typedef与数组类型、数组指针
typedef int num[5]; //定义数组类型typedef char *num1[5]; //定义指针数组类型typedef int(*num2)[5]; //定义指向多维数组的指针类型int (*num3)[5]; //定义指向多维数组的指针变量 测试程序:#include <stdio.h>#include <stdlib.h>...原创 2018-09-17 21:01:18 · 3700 阅读 · 0 评论 -
typedef 与函数类型 函数指针类型
typedef void (f)(int, int); //定义一个函数类型typedef void(*f1)(int, int); //定义一个函数指针类型void(*f2)(int, int); //定义一个函数指针变量测试:#include <stdio.h>typedef void (f)(int, int);typedef void(*f1)(i...原创 2018-09-17 21:21:24 · 263 阅读 · 0 评论 -
C存储类
C为变量提供5种不同的存储模型,或称存储类。作用域:一个C变量可以是文件作用域、函数原型作用域、代码块作用域。(函数的形参也属于是代码块作用域)传统上,具有代码块作用域的的变量都必须在代码块的开始出进行声明,C99放宽了这一规则;函数原型作用域适用于函数原型中使用的变量。(int mighty(int mouse,double large);)链接:一个C变量语句下列链接之一:外部链接、内部链接或...原创 2018-07-11 10:54:20 · 219 阅读 · 0 评论 -
perror函数
#include <stdio.h>void perror(const char *s);函数perror把errno中的错误编号转换为一条错误信息。原创 2018-06-28 19:15:30 · 106 阅读 · 0 评论 -
浮点数的表示
计算机中浮点数的表示:浮点数表示包括:符号域 基数 指数 尾数基数是2以0.8125为例:3f 50 00 000011 1111 0101 0000 00000000 00000000标红的为指数。尾数部分默认把1提取出来,那么小数部分就是1.101指数的值为126,需要减去127,也就是-1那么小数的值就是1.101*2^(-1) 也就是 0.1101...原创 2018-05-31 09:16:01 · 419 阅读 · 0 评论 -
scanf与printf
例: scanf("%d%d",&a,&b);如果scanf格式控制串中没有非格式字符作为分割,输入时需要用空格或者回车作为两个数的间隔。如果格式控制串中有非格式字符,那么输入时也需要输入该非格式字符。(scanf("%d,%d",&a,&b) )在输入字符数据时,如果格式控制串中没有非格式字符,则所有的输入字符都是有效的。比如:scanf("%c%c%c",&am...原创 2018-05-31 09:50:12 · 184 阅读 · 0 评论 -
字符串处理函数
数组名是常量。gets函数: 原型 char *gets(char *s);以回车作为结束标志 。 存在缓冲区溢出的问题。puts函数:原型 int puts(const char *s);结尾自动添加换行strcpy函数: char *strcpy(char *s1,const char *s2);如果一个字符数组已经初始化过,需要给它重新赋值,可以用 该函数实现。存在缓冲区溢出的问题,可以用...原创 2018-05-31 11:40:16 · 112 阅读 · 0 评论 -
内存操作函数
memcpy函数:void *memcpy(void *s1,const void *s2,size_t n);void *表示无类型指针memmove函数: void *memmove(void *s1,const void *s2,size_t n);memset函数:void *memset(void *s1,int c,size_t n);把c转换为char型复制到s1指向的空间的n个字符...原创 2018-05-31 13:54:18 · 302 阅读 · 0 评论 -
动态存储分配
malloc函数:void *malloc(size_t n); 分配n个字节的内存单元,分配成功,返回内存单元的首地址。分配失败,返回NULL。calloc函数:void *calloc(size_t nmemb,size_t size);分配nmemb个(每个大小为size)的内存单元,内存单元初始化为0.分配成功,返回内存单元的首地址。分配失败,返回NULL。realloc函数:void *...原创 2018-05-31 16:19:25 · 486 阅读 · 0 评论 -
文件操作
从文件编码方式来看,文件可分为ASCII码文件(文本文件)和二进制文件。文本文件每个字符对应一个字节,存放对应的ASCII码。fopen函数:FILE *fopen(const char *filename,const char *mode);打开方式有:r w a b(二进制文件) t(文本文件,可省略不写)fclose函数:int fclose(FILE *stream);关闭文件...原创 2018-05-31 17:27:04 · 158 阅读 · 0 评论 -
指针常量与指向常量的指针
const char *p;char const *p;上述两个表示 指向常量的指针不能修改指针指向的值char *const p;表示指针常量可以修改指针指向的值,但是不能修改指针原创 2018-06-01 16:19:00 · 148 阅读 · 0 评论 -
C实现C++中的多态
C是通过函数指针做函数参数来实现类似C++多态的效果。程序:#include <stdio.h>void test(int a, int b) { //模块 if (a > b)printf("%d", a); else printf("%d", b);}typedef void(*f)(int, int);void test1(f p) { //...原创 2018-09-17 21:51:33 · 296 阅读 · 0 评论