C语言
2020-04-22 10:34:44 0 举报
AI智能生成
C语言基础总结
作者其他创作
大纲/内容
基本语法
关键字
const
sizeof
sizeof(type)以字节为单位生成对象
或者类型的额存储大小
或者类型的额存储大小
const
static
修饰局部变量时可以在函数调用之间保持局部变量的值
修饰全局变量时,会使全局变量作用域限制在它所声明的文件内
修饰全局变量时,会使全局变量作用域限制在它所声明的文件内
extern
提供全局变量的一个引用,全局变量对所有的程序文件都可见
用来在另一个文件中声明一个全局变量或函数
typedef
用来为类型取一个新的名字;
例:为结构体去一个新名字 node
例:为结构体去一个新名字 node
typedef 与 #define 区别
1.typedef仅限于为类型定义符号名称;
#define不仅可以为类型定义别的名称而且可以为数值定义别名
#define不仅可以为类型定义别的名称而且可以为数值定义别名
2.typedef有编译器执行解释的;
#define是由预处理中进行处理的
#define是由预处理中进行处理的
标识符
数字,字母,下划线组成
变量
变量定义;
初始化(局部变量必须初始化);
默认NULL
初始化(局部变量必须初始化);
默认NULL
声明
只能在一个文件,函数或者代码块中定义一次
用关键字extern使用(尽量多使用)
当左值
常量
定义常量
使用#define预处理
使用const关键字
数据类型
基本类型
整数类型
char 1字节
题目:unsigned char c1 = 255, c2 = 2;
int n = c1 + c2;
不会溢出,运算时在寄存器中,32位
int n = c1 + c2;
不会溢出,运算时在寄存器中,32位
int 2或4字节
unsigned int 2或4字节
short 2字节
long 4字节
浮点数类型
float 4字节;
6位小数
6位小数
double 8字节;
15位小数
15位小数
long double;
16字节;
18位小数
16字节;
18位小数
void类型
函数返回为空;
void fun(int x)
void fun(int x)
函数参数为空;
int fun()
int fun()
指针指向void;
无布常概念,可以转换成任意数据类型
无布常概念,可以转换成任意数据类型
派生类型
指针类型
数组类型
结构体类型
函数类型
共用体类型
强制类型转换
强制类型转换运算符
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
显式转换(尽量加上)
double mean;
mean = (double) sum / count;
显式转换(尽量加上)
整数提升
即把小于int或者unsigned int的整数类型转换为int或。。型的过程
判断
有精度时候不能用==
a == 1.0 ×
a == 1.0 ×
if--else
switch;
case 1:;
break;
case 1:;
break;
循环
while
明确知道推出条件
for
明确知道循环次数
do—while
循环体至少执行一次
循环控制语句
break语句
终止循环或者switch语句
continue语句
停止本次循环,重新开始下次循环
goto语句
将控制转移到被标记的语句(禁用)
递归
调用自身的函数
汉诺塔
阶乘
斐波那契数列
数组
都是由连续的内存位置组成
多维数组
二维数组(一般使用)
实际上是一个一维指针 int*[x]
需要双重循环
传递数组到函数
通过不带索引的数组名称来给函数传递一个指向数组的指针
使用定义
void my_fun(int *name)
void my_fun(int name[])
void my_fun(int name[10])
C中不会对形参进行边界检查(数组长度无关紧要)
从函数返回数组
不用允许返回一个完整的数组作为函数的参数
但可以通过数组名来返回一个指向数组的指针
int *my_name( )
C 中不支持在函数外返回局部变量的地址
除非定义局部变量为 static 变量
指向数组的指针
用数组名称生成一个指向数组第一个元素的指针
int *p =a;
&a[0] = p = &p[0]
声明数组
指定元素类型
元素数量
初始化数组(数组赋值)
访问数组元素
栈中,可读可写
指针
定义
是一个变量,其值是一个变量的地址,即内存位置的直接地址,
rodata中可读不可写
使用
定义一个指针变量
把变量地址赋值给指针
访问指针变量中可用地址的值
使用 * 来返回位于操作数所指定地址的变量的值
NULL指针
如果没有确切的地址可以赋值,为指针变量赋一个NULL值
大多数操作系统中,程序是不允许访问地址为0的内存, 该内存为操作系统保留,表明该指针不指向一个可访问的内存地址。
概念
指针的算术运算
可进行 + - ++ --
指针的 比较
== < >
指针数组
让数组存储指向 int 或者char 或其他数据类型的指针
例:一个指向整数的指针数组的声明
int *ptr[MAX]
指向指针的指针
int **var;
传递指针给函数
声明函数的参数为指针类型
能接受指针作为参数的函数,也能接受数组作为参数
从函数返回指针
字符串
定义与使用
实际上是使用null 字符'\0' 终止的一维字符数组
初始化数组时,自动将'\0' 放在字符型串的末尾
字符串 string.h
strcpy(s1, const s2)
复制字符串s2到s1
strncpy(s1, const s2, size n)
消除bug,告诉数组的大小
strlen(s1)
返回s1的长度
strcmp(s1, s2)
比较: 如果s1和s2相同返回0; s1<s2返回小于0; s1>s2返回大于0;
strchr(s1, ch)
返回一个指针,指向字符串s1中字符ch 的第一次出现的位置
strstr(s1,s2)
返回一个指针,指向字符串s1中s2的第一次出现的位置
输入输出
C语言本身是不带输入输出语句的,是通过库函数来实现的。
getchar()&putchar()
int getchar(void) 一次一字符利用循环读取
int putchar(int c) 同一时间只能输出一个字符
gets()&puts()
char *gets(char *s)读取一行到s,直至一个终止符或EOF
int puts(char *s) 输出s 和尾随的一个'\n'换行符
scanf()&printf()
int scanf(const char *x) 必须提供有效的输入 不能加‘\n’
int printf(const char *x)根据提供的格式输出
共用体
定义
允许在相同的内存位置存储不同的数据类型
定义共用体
与结构体类型相似
占用的内存用足够存储共用体中最大的数据成员
访问共用体成员
成员访问运算符
同一时间只能用到一个成员
否则最后赋给变量的值占用内存位置
结构体
定义
用户自定义的一种数据类型
允许存储不同类型的数据项
定义结构
必须使用strct 语句
访问结构成员
成员访问运算符 (.)
结构作为函数参数
void printBook(struct BOOKS book)
指向结构的指针
struct Books *struct_pointer;
struct_pointer = &Book1;
struct_pointer->title:
位域
在变量之后加上 :位长度在结构定义中完成
例:unsigned int f1 :1;
C简介
易于学习;
结构化语言;
高效率程序;
充分信任程序员;
处理底层活动;
移植性强
结构化语言;
高效率程序;
充分信任程序员;
处理底层活动;
移植性强
[ app ];
[ os ];
[ HAL ];
[ hardware ]
[ os ];
[ HAL ];
[ hardware ]
概述
贝尔实验室1972年为开发UNIX操作系统的计算机编程语言
头文件
定义
头文件是扩展名为.h的文件,包含了C函数声明和宏定义,被多个源文件引用共享。
引用头文件
引用系统头文件
引用用户头文件
引用头文件的操作
只引用一次头文件
有条件引用
预处理
概念
指示编译器再实际编译前需要的处理、
指令
#define 宏定义
#define MAX_ARRAY_LENGTH 20 //把程序中的MAX__ 都替换为20
宏延续符 '\' 宏太长时,
字符串常量化运算符 '#' 把一个宏的参数转换为字符串常量
标记粘贴运算符 '##' 宏定义内两个独立的标记被合并为一个标记
defined预算符 用来确定一个标识符是否已经使用#define定义过。定义为真(非零),未定义为假(零)
参数化的宏 int square(int X){
return X * X;
} <=>
#define square(X)((X) * (X))
预定义的宏
__DATE__ 当前日期,格式 MMM DD YYYY 字符常量
__TIME__ 当前时间, 格式HH:MM:SS 字符常量
__FILE__ 这会包含当前文件名,字符串常量 例:test.c
__LINE__ 包含当前行号, 十进制常量
#include 包含一个源代码文件
#include<stdio.h>告诉编译器从系统库中获取stdio.h,并添加文本到当前的源文件中
#include"myheader.h"告诉编译器从本地目录中获取myheader.h,并添加内容到当前的源文件中
#undef 取消已定义宏
#undef FILE_SIZE 告诉编译器已取消定义的FILE,并定义成42
#define FILE_SIZE 24
#ifder 如果宏已定义,则返回真
#ifdef DEBUG 如果定义了DEG,则执行处理语句,在编译
/*your debugging statements here*/ 时如果你向gcc 编译
#endif 器传递了-DEEBUG开关量,这个指令很有用,可在编译期间随时开启和关闭调试
#ifndef (包装器) 如果宏没定义,则返回真
#ifndef MESSAGE 告诉只有当M为定义时,才定义M
#define MESSAGE "you wish"
#endif
#if 如果给定条件为真的话 编译下面的代码
#else #if的替代方案
#error 当遇到标准错误时,输出错误信息
作用域规则
代码块作用域
局部变量
只能被函数或改代码块的语句使用
文件作用域
static+全局变量=在本文件可见(不会释放空间)
原型作用域
数组做形参会退化为指针
全局变量
定义在函数内部,;
在整个生命周期有效
在整个生命周期有效
尽量避免全局变量和局部变量同名
函数中权限:形参>局部变量>全局变量 均会覆盖掉全局变量
作用域大小
局部变量(自动变量)<静态局部变量<静态全局<全局
程序结构
1.预处理
2.函数
3.变量
4.语句&表达式
5.注释
内存分配
动态内存管理
<stdlib.h>
void *calloc(int num, int size)
在内存中分配num个长度为size的连续空间,并将每一个字节都初始化为0.所以其结果为分配了num*size个字节长度的空间,并且每个字节的值都是0
void *malloc(int num)
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化。它们的值是未知的。
void free(void *address)
该函数释放address所指向的内存块,释放的是动态分配的内存空间
void *realloc(void *address, int newsize)
该函数重新分配内存,把内存扩展到newsize
(尽量不要用)
动态分配内存
需要定义一个指针,该指针指向未定义所需内存大小的字符,后续根据需求来分配内存。
重新调整内存的大小和释放内存
当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,尽量在不需要内存时,调用函数free()来释放内存
也可以通过realloc()来增加或减少已分配的内存块大小
命令行参数
int main(int arge, char *argv[ ])
argc是指传入参数的个数,
argv[]是一个指针数组,指向传递给程序的每个参数
argv[0] 存储程序的名字 ./a.out
argv[1] 指向的一个命令行参数的指针,
*argv[n]指向最后一个命令行参数的指针
argc 为1 =》没有提供任何参数
argc 为2 =》传递了一个参数
多个命令行参数之间用 空格分隔
如果参数本身带有空格,那么传递参数时应把参数放置在“ ”或者' '中
函数
定义函数
返回类型
函数名称
参数(占位符)
形参
等同于函数内部的局部变量,进入函数被创建,退出函数被销毁
函数不被调用时不为其分配空间
实参
函数被调用时向参数传递一个值
函数主体
函数声明
先声明后使用
函数声明是参数的名称不重要,参数的类型是必需的
默认声明是 int
函数调用
按值传递
void swap(int a,int b) swap(a,b)
按地址传递
void swap(int *a,int *b) swap(&a,&b)
错误处理
概念
以返回值的形式允许访问底层数据。
在发生错误时,大多数C或UNIX函数调用返回1或者NULL,同时设置一个错误代码error,该错误代码是全局变量,表示在函数调用期间发生了错误。<errno.h>中有各种各样的错误代码。
程序员可通过检查返回值,根据返回值决定采取什么措施。开发人员应在程序初始化时,把errno设为0,表示没有错误
errno(错误对照表)
strerror()
显示您传给它的字符串,后跟一个冒号,一个空格和当前errno值的文本表示形式
perror()
指针指向当前error值的文本表示形式
被零除的错误
在进行出发运算时,如果不检查除数是否为零,则会出现一个运行时错误。
程序退出状态
通常情况下,程序成功执行完一个操作正常退出的时候会带有值EXIT_SUCCESS, 这里它是宏,被定义为0;
如果程序中存在一种错误情况,当退出程序时,会带有状态值EXIT_FAILURE,被定义为-1.
0 条评论
下一页