![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言基础教程
文章平均质量分 59
小时光cdk
这个作者很懒,什么都没留下…
展开
-
4. 声明符
4. 声明符声明符有简单的变量标示符、数组([]结尾)、指针(*打头)和函数(()结尾)。该博客教程视频地址:http://geek99.com/node/1036#原文出处:转载 2014-05-14 11:37:51 · 477 阅读 · 0 评论 -
4. 作用域
4. 作用域在C程序中同一个标示符可以重复出现,并且根据出现的位置具有不同的意义。例如,下列代码,变量i重复出现多次,但是意义各部相同。/*全局变量,静态存储期限、文件作用域*/int i;/*形参,自动存储期限、程序块作用域*/void f(int i){ i = 1;}void g(void){ /*局部变量,自动存储期限、程序块作用域*/转载 2014-05-13 15:23:02 · 313 阅读 · 0 评论 -
3. 程序块
3. 程序块程序块是大括号包含起来的部分{}。函数体内的多条语句构成程序块,程序块也可以是条件语句或循环语句中的多条语句。在程序块中的变量具有自动存储期限,和程序块作用域。该博客教程视频地址:转载 2014-05-13 15:19:06 · 466 阅读 · 0 评论 -
3. 字符数组和字符指针
3. 字符数组和字符指针3.1 看下面两个声明char *str = "Hello World!";char str1[] = "Hello World!";3.2 字符数组和字符指针的区别1. 字符数组和任何其他数组一样,数组元素可以被修改,而字符指针保存的是字符串字面量,不能被修改。2. 声明为字符数组时str1为数组名称,而声明为字符指针时str为指针变量,可以被重新转载 2014-05-13 12:10:17 · 368 阅读 · 0 评论 -
4. 释放内存
4. 释放内存4.1 malloc等内存分配函数分配的内存,会在内存堆里面,如果一直分配就会造成内存耗尽的危险。4.2 分配的内存不再使用需要手动释放,释放函数是void free(void *ptr); int *a,*b; a = malloc(5); b = malloc(6);转载 2014-05-13 11:13:08 · 298 阅读 · 0 评论 -
3. 动态分配数组
3. 动态分配数组3.1 当编程时很难为数组估计大小,可以在运行程序时,动态为程序分配大小。3.2 动态分配数组大小和分配字符串大小相似,可以使用sizeof来计算数据类型占用的字节数,再来分配,例如:int *a = malloc(n*sizeof(int));3.3 可以使用 calloc来分配内存大小,calloc可以对分配的内存进行初始化。calloc的函数原型为:void转载 2014-05-13 11:07:15 · 1122 阅读 · 0 评论 -
1. 动态内存分配
1. 动态内存分配1.1 C语言的数据结构,通常都是固定大小的,比如:数组有固定的大小,而每个元素也有固定的长度。这样对程序有一定限制,例如:我们要使用数组来保存一个班级的学生信息,数组的长度指定多大合适呢?太大浪费空间,太小不够用。这时候就会用到内存的动态分配。1.2 内存分配函数malloc函数,分配内存,但是不对内存进行初始化。calloc函数,分配内存,并且对内存进转载 2014-05-13 09:45:16 · 399 阅读 · 0 评论 -
1. 局部变量
1. 局部变量在函数体内,或者是形参都是局部变量。局部变量具有自动存储期限和块作用域。#include /* 交换连个数 */void swap(int a,int b){ printf("a=%d,b=%d\n",a,b); int tmp; tmp = a; a = b; b = tmp; printf("a=%d转载 2014-05-13 15:00:55 · 324 阅读 · 0 评论 -
4. 条件编译
4. 条件编译4.1 #if #endif#if #endif 会根据#if后面的条件来判定是否执行#if #endif直接的代码,例如:#define DEBUG 1void test6(){#if DEBUG printf("打印调试信息1\n"); printf("打印调试信息2\n");#endif}4.2 #ifdef #ifnde转载 2014-05-13 13:55:37 · 354 阅读 · 0 评论 -
2. 预处理指令
2. 预处理指令2.1 宏定义。#define指令定义一个宏,#undef指令删除一个宏2.2 文件包含。#include指令将包含当前文件到程序中。2.3 条件编译。#if、#ifdef、#ifndef、#elif、#else和#endif,将根据条件包含代码块到程序当中,或将代码块排除在程序外。预定义指令的规则:1. 指令以#号打头,并且不是必须定义在程序开始位置(虽然都这转载 2014-05-13 13:52:00 · 573 阅读 · 1 评论 -
1. 预处理的工作原理
1. 预处理的工作原理预处理器可以在编译器对C程序编译之前,进行重新编辑(修改源代码)工作。这个过程包括:1.1 将使用#define指令进行的宏定义进行匹配替换1.2 将使用#include指令包含的头文件添加到当前文件中1.3 将预定义指令删除1.4 删除注释1.5 可以使用gcc –E Hello.c 查看预编译器的输出结果,例如下面程序的输出结果将包含stdio转载 2014-05-13 13:50:54 · 1621 阅读 · 0 评论 -
3. 枚举
3. 枚举枚举(enumeration),也称为枚举常量,允许程序员定义一组有关联关系的常量。例如,程序中要定义三种颜色常量:红色(RED)、绿色(GREEN)、蓝色(BLUE)。或者在游戏中定义玩家操作游戏的四个方向上(UP)、下(DOWN)、左(LEFT)、右(RIGHT)。enum color { RED = 1, GREEN = 2, BLUE = 3转载 2014-05-13 14:57:45 · 501 阅读 · 0 评论 -
2. 动态分配字符串
2. 动态分配字符串2.1 malloc函数原型,void *malloc(size_t size); size_t 是一个无符号整型。2.2 C中的字符占用一个字节大小,为n个大小的字符串分配空间,可以使用 malloc(n+1)来分配。多出的一个字节保存字符串结束符‘\0’。2.3 自定义字符串连接函数char *concat(const char *s1,const char转载 2014-05-13 10:26:03 · 537 阅读 · 0 评论 -
1. 一维数组
1. 一维数组1.1 数组是包含多个数据值的数据结构。1.2 数组中的每个数据值的类型都相同。1.3 数组中的每个数据值被称为数组中的元素(element)。1.4 可以通过小标(索引)的方法,来访问数组中的元素,数组的下标从0开始。1.5 声明数组,需要说明类型和元素数量,例如:int a[10];1.6 通过使用for循环来访问数组中的元素,例如:for(int i=0转载 2014-05-12 10:43:32 · 409 阅读 · 0 评论 -
4. return语句
4. return语句4.1 有返回值的函数,必须使用return语句返回。4.2 调用return语言,函数将退出,并返回到函数的调用处。4.3 甚至我们可以使用return退出循环。4.4 实例#include // 验证return 返回到被调用处void f1();void f2();void f3();// 测试退出循环void exit_lo转载 2014-05-12 10:40:18 · 397 阅读 · 0 评论 -
3. 指针的赋值
3. 指针的赋值3.1 指针的赋值是变量地址的赋值3.2 实例#include void test_pointer(){ int i,*p,*q; p = &i; // 地址传递 q = p; *p = 100; printf(转载 2014-05-12 11:00:04 · 466 阅读 · 0 评论 -
5. 链表
5. 链表5.1 链表是由一连串节点组成的,其中每个节点都包含指向下一个节点的指针。struct node{ int value; struct node *next;};5.2 添加链表节点struct node *first = NULL;struct node *new_node = malloc(sizeof(st转载 2014-05-13 11:21:22 · 366 阅读 · 0 评论 -
1. 结构
1. 结构1.1 结构特性结构是一种复合类型,和之前的数组类似。不同的是数组中的数据类型相同,而结构中的数据可以不同。正是因为数组中保存的数据相同,所以可以通过下标(索引)来访问,而结构则不能通过索引来访问。1.2 结构变量的声明结构可以把相关联的变量保存在一起,这样会很方便。例如,我们可以把一个人的信息定义在一个结构中,这些信息可能有姓名、年龄、性别、住址等。结构中的变量成为结构转载 2014-05-13 14:18:12 · 419 阅读 · 0 评论 -
3. 类型限定符
3. 类型限定符类型限定符有const和volatile,const声明的变量不能被修改,volatile大部分用在底层编程中,例如嵌入式程序中。转载 2014-05-14 11:36:34 · 410 阅读 · 0 评论 -
2. 存储类型
2. 存储类型存储类型有4个 auto、static、extern和register,这4个都可以放在变量前面,放在函数前面的只有两个extern和static2.1 变量的特性每个变量都有3方面特性:存储期限,变量的存储期限决定了变量在内存中存在的时间,自动存储期限的变量在所属块程序被执行时分配内存,在离开是释放内存,这一般是代码块或函数内部的变量及函数的参数。静态存储期限的变量转载 2014-05-14 11:35:14 · 380 阅读 · 0 评论 -
1. 声明的语法
1. 声明的语法声明的语法格式是:声明说明符 声明符 例如:extern const unsigned long int a[10]; 前面部分extern const unsigned long int为声明说明符 后面a[]为声明符声明说明符分为三类:存储类型:4个 auto、static、extern和register类型限定符:两个const和volatile类型说转载 2014-05-14 11:06:06 · 434 阅读 · 0 评论 -
1. 头文件简介
1. 头文件简介1.1 到目前为止,我们所写的程序都在一个源文件main.c中,但是实际项目当中可能有成千上万个源文件。我们可以想象一下如果开源Linux操作系统中只有一个main.c源文件该如何实现。大型项目中将会按照不同的模块分为多个源文件,例如做一个在线电子商务项目,可以有客户、订单、商品、购物车等模块,那么,就可以按照这些模块定义不同的源文件。 1.2 将程序按照模块定义在转载 2014-05-14 10:06:51 · 490 阅读 · 0 评论 -
3. 构建多文件程序
3. 构建多文件程序案例-在线电子商务 在这个案例中我们有四个模块:商品、客户、订单和购物车,我们将根据这些模块来定义不同的头文件和源文件。商品的头文件和源文件:product.h #ifndef C_15_01_product_h#define C_15_01_product_h// 设置商品编号void setpid(int pid);// 获得商品转载 2014-05-14 10:38:10 · 423 阅读 · 0 评论 -
2. 头文件
2. 头文件2.1 使用头文件共享宏定义和类型定义 我们一般将程序中使用到的宏定义和类型定义,写在头文件中,使用时直接包含头文件即可。例如,可以定义一个global.h 头文件,在其中定义一些全局宏定义和类型定义。#ifndef C_15_01_global_h#define C_15_01_global_h#define TRUE 1#define FALSE 0转载 2014-05-14 10:19:15 · 456 阅读 · 0 评论 -
5. 构建C程序
5. 构建C程序C程序的结构如下:#include#define类型定义外部变量函数声明main函数函数定义例如:/*文件包含指令*/#include /*宏定义*/#define TRUE 1#define FALSE 0/*类型定义*/typedef int Bool;/* 外部变量*/int global = 100;转载 2014-05-14 09:09:52 · 408 阅读 · 0 评论 -
2. 联合
2. 联合和结构一样,联合(union)也可以有一个或多个成员,每个成员的类型也可以不相同。但是,编译器只为联合中最大的成员分配足够的内存空间。联合成员在这个空间中彼此覆盖。联合的定义和结构类似:union datetype { int i; float f; double d;};测试代码:union datetype dt;dt.i =转载 2014-05-13 14:34:16 · 386 阅读 · 0 评论 -
5. 使用字符串库函数
5. 使用字符串库函数5.1 计算字符串长度,函数原型如下:size_t strlen(const char *s);size_t 是一个无符号整型 unsigned int该函数返回第一个空字符\0前面的字符个数。#include // 获得字符串长度void test_strlen(){ char str[] = "Hello World转载 2014-05-13 13:49:49 · 382 阅读 · 0 评论 -
2. 外部变量
2. 外部变量函数直接可以通过参数传递的方式来通信,可以可以通过外部变量的方式来通信。外部变量,也称为全局变量,是定义在函数外部的变量。外部变量具有静态存储期限和文件作用域。在程序运行期间,保存在外部变量的值将一直存在。在整个文件中的各个函数都可以访问外部变量。/* 全局变量*/int global = 100; /* 读 */void read(){转载 2014-05-13 15:13:12 · 348 阅读 · 0 评论 -
4. 字符串的读写
4. 字符串的读写4.1 可以使用printf和puts来输出一个字符串,printf提供了格式化输出,可以使用%s来输出一个字符串,还可以使用 %.ps 来输出字符串的一部分,p表示字符串的个数。puts只提供一个字符串参数,可以自动换行。// 使用prinf和puts写字符串void test5(){ char str[] = "Hello World!"转载 2014-05-13 13:28:16 · 360 阅读 · 0 评论 -
1. 字符串字面量
1. 字符串字面量1.1 字符串字面量是指使用双引号“”括起来的的字符序列,例如:“Hello World”。1.2 在C语言中,把字符串当做字符数组来处理,当遇到长度为n的字符串时,程序分配长度为n+1的数组来保存,最后一个字符表示字符串的结束’\0’.1.3 根据我们知道的数组和指针的关系,可以使用字符指针来保存字符串常量,例如: char *c ;c = “Hello world转载 2014-05-13 11:33:11 · 524 阅读 · 0 评论 -
6. 函数指针
6. 函数指针#include #include #include void f(int);void (*fp)(int);int main(void){ f(100); fp = &f; fp = f; (*fp)(200); fp(300转载 2014-05-13 11:23:39 · 373 阅读 · 0 评论 -
3. 宏定义
3. 宏定义3.1 宏定义的格式:#define 标示符 替换列表3.2 常见错误:#define N=10 /* 错误使用了等号(=)*/#define N 10; /*错误使用了分号(;)*/3.3 使用宏定义的优点:3.3.1 程序可读性更强,例如:在程序中使用AGE,比使用20,可读性更强。3.3.2 程序修改方便,程序中如果有100个地方使用了宏定义,我们只修转载 2014-05-13 13:54:36 · 664 阅读 · 0 评论 -
2. 字符串变量
2. 字符串变量2.1 C语言使用字符数组保存字符串变量,最后以一个空字符’\0’结尾,注意:空字符’\0’和字符’0’的区别,空字符的ASCII值为0.2.2 假设字符串中要保存10个字符,那么我们应该设置字符数组的长度为11,因为,最后一个表示字符串的结束。#define STR_LEN 10 char str[STR_LEN+1];2.3 字符串变量的初始化#includ转载 2014-05-13 11:34:23 · 399 阅读 · 0 评论 -
5. 递归调用
5. 递归调用5.1 递归是指函数自己调用自己。5.2 使用递归的条件:1. 自己调用自己。2. 有结束条件,否则将出现死循环。5.3 使用递归实现阶乘。#include // 使用循环实现阶乘void loop_fact1();// 使用递归实现阶乘int recersive_fact();int main(void){转载 2014-05-12 10:41:52 · 358 阅读 · 0 评论 -
3. 参数传递
3. 参数传递3.1 函数的参数分为形式参数和实际参数,定义函数时的参数是形式参数,调用函数时传递的参数值是实际参数。3.2 C语言中的函数参数传递是值传递,当调用函数时将实际参数值复制给形参。3.3 实例#include // 两个数的最大值int max(int a,int b);// 交换两个数(验证值传递)void swap(int a,int b);i转载 2014-05-12 10:14:47 · 319 阅读 · 0 评论 -
1. 指针的算术运算
1. 指针的算术运算1.1 指针不仅可以指向普通的变量,还可以指向数组元素。例如:int a[10],*p;p = &a[0];1.2 指针指向数组元素后,可以通过访问指针来访问数组。例如:int a[10],*p;p = &a[0];*p = 10;printf("a[0]=%d",a[0]);1.3 指针指向数组元素后,可以对指针进行一些算术运算。1.3转载 2014-05-12 11:04:07 · 536 阅读 · 0 评论 -
2. 算术运算
2. 算术运算2.1 C语言中的算术运算包括:加(+)、减(-)、乘(*)、除(/)和求余(%)。2.2注意:运算符/和%的特殊性:两个整数相除会去掉小数部分,例如:1/2 = 0 二不是0.5%的两个运算符必须是整数,如果不是整数将编译失败!当操作数有负数时,%和/的计算结果与机器的具体实现有关,即可以向上取整也可以向下取整。#include int main(voi转载 2014-05-11 17:25:24 · 385 阅读 · 0 评论 -
1. 赋值运算
1. 赋值运算1.1 计算表达式的值,并将其存储在变量中这个过程叫做赋值,表达式v=e的意思是,计算表达式e的值并将其复制给v。1.2 表达式可以是一个常量、变量或者其它表达式1.3 如果v和e的类型不同,e会自动转换为v的类型。1.4 v必须是一个左值,左值是存储在计算机内存中的对象,不能是常量或计算结果。变量是左值,而1或2*PI不是左值。1.5 符合赋值v+=e 等价转载 2014-05-11 17:09:49 · 445 阅读 · 0 评论 -
2. 浮点型
2. 浮点型浮点类型是带有小数点的数据类型,浮点类型可以分为单精度float类型和双精度double类型。一般双精度类型的长度是单精度的两倍,表示的数据更精确。C语言还提供了long double 高精度的数据类型,一般很少用到。可以使用float.h来检测浮点类型的取值范围。#include #include int main(void) { // 浮点转载 2014-05-11 16:30:21 · 510 阅读 · 0 评论 -
1. 整型
1. 整型整型是一个或多个数字序列,有正负之分。可以表示为8进制和16进制,八进制前面加0,16进制前面加0x。整型的长度根据不同的机器有所不同,一般是32位,可以使用sizeof函数测试整型的长度。可以使用limits.h中宏来判定整型的取值范围。下表是32机器中整型的取值范围:#include #include int main(void) {转载 2014-05-11 16:28:45 · 366 阅读 · 0 评论