目录
前言
自我思考,总结C语言基础的数据语法、函数、定义以及使用方法,例如:数制、运算符、字符与字符串、数组、常用函数、指针、结构体,将梳理C语言的整体。
一、数据
我认为数据是信息的线上的载体,数据包括了数字、图片、文字、视频等等。
1.基本类型
数据的类型:基础类型 空类型 构造类型
基础类型:整型、字符型、浮点型、枚举型(enum)、指针类型
空类型:void 它是一种特殊的类型,是所以数据类型的基础,常用在数据类型的传递参数与类型转换中
构造类型:数组、结构体、共用体(union),它由基础类型复合而成的类型
以上基础类型都分有符号(signed)与无符号(unsigned),有无符号指有无正负(+ -),这决定这取值范围和有效数字。
例如:有符号 int 取值范围:2^(-32) ~ 2^(+32) 而无符号 int 取值范围:0 ~ 2^(32) 曲二者的交集可提高程序的可移植性,这在编程中是很重要的
2.常量与变量
常量是程序运行中不可更改的量 。
类型:整型(2进制、8进制、10进制、16进制,以二进制存储在电脑内存中)、字符型常量(以单引号括起来的单个字符,以ASCII存储在电脑内存中)
同理变量就是可更改的量,例如基础类型变量 int a
2.1 常量与变量
在C语言中,规定语法为:先定义、后使用,任何变量使用前都必须遵循
常量的定义,需要const 关键字
2.2 作用域
根据变量的作用域不同,区分了局部变量和全局变量,局部变量就是定义在函数内部的变量,全局变量则在函数之外。
不同点:未赋初值时,全局变量系统自动赋值为0,只能定义一次,作用范围为整个函数,生命周期直到整个函数的结束;局部则自动赋值为随机数,作用范围只在定义的函数内部有效,函数调用结束则局部变量结束
当局部变量与全局变量重名时,局部变量有效。
2.3 存储模型
静态存储变量:编译时分配内存空间且保存不变,直到整个程序的结束,全局变量就属于静态存储
动态存储变量:运行时才分配内存空间,使用完成后立即释放内存空间。
static 静态类型说明符 有static修饰的才是静态变量,具有静态存储、内部链接
静态全局变量:未赋初值自动 0,作用域:整个函数 生命周期:整个函数结束为止
内部链接,即不可被其他源文件引用。
静态局部变量:随机数 作用域:定义函数内 生命周期:由函数内扩展到整个函数
内部链接 动态变量:动态存储,外部链接。
3. 预处理
1.将.h文件替换到被预处理的文件中 2. 将宏定义替换 3. 清除所有的注释
二、输入输出
1.数据的输出输入
2.1 字符输入输出
putchar()字符输出函数 getchar()字符输入函数
2.2 格式化输入输出
int printf( const char * format....) 格式化输出函数 format 为指定输出格式,.... 为不定参
成功返回输出的字符数 失败返回 -1(EOF)
scanf()格式化输入函数
3.字符串输入输出
puts()字符串输出函数,成功在终端显示字符串,失败 -1(EOF)
gets() 字符串输入函数,成功从键盘读取输入的字符串放入字符数组中且自动加 '\0' ,失败返回NULL
三、运算符及表达式
1.运算符及表达式
1.1 算术与赋值运算符
算术运算符:加减乘除取余(+ - * / %) 赋值运算符:=
类型转换: 自动转换 赋值转换 强制类型转换 % 两边只能是整数
赋值运算符是将 左=右 右边的赋值给左边
1.2 逗号与位运算符
逗号运算符:,位运算符:<< >> & | ^ ~
逗号运算符 ,是把表达式连接起来组成一个表达式 y=(x=3+4),(5+6) 问y是多少? y是11.
位运算符常用于硬件信号中,例如 把某个bite位 置1 置0
置1: a |= (1<<i) 置0: a &=(0<<i) a<<3 表示a整体扩大2^3 倍;a>>3 即缩小2^3 倍
1.3 关系与逻辑运算符
关系运算符:> < == >= <= != 逻辑运算符: && || !
逻辑运算符: && 同真为真 一假为假
|| 一真为真 同假为假 !真为加 加为真 在C语言判断中非零即为真
1.4 sizeof操作符与条件运算符
求字节运算符:sizeof() 求变量(类型大小即变量大小,32位中所有指针变量大小都为4bite)、数组(数组元素个数 x 数组类型大小)、结合体的占空间内存大小,单位:比特
条件运算符:条件? a:b C语言唯一的三目运算符 如果条件为真 执行a ,如果条件为假则执行b
也可以用条件语句(if() switch() )来替换实现它的功能。
分量运算符: . -> 结构体访问成员变量使用 ' . ' 结构体指针访问成员变量使用 ‘ -> ’
下标运算符:[] 数组 例如: int a[10]
自加自减运算符:++ -- 谁在前就先执行谁 例如:++a // ++ 在前表示:a=a+1 自身先加1;a 表示赋值 -- 同理
2.运算符优先级
口诀:
括号成员第一名( () [] . -> );群体单目第二( ++ -- +(正) -(负) );
乘除余三( * / % ),加减四(+ - );
位移五(<< >>),关系六(> < >= <= );等于不等排第七(== !=)
位与异或或"三分天下,八九十" ( & ^ | ); 逻辑与十一 ( && )、或十二 ( || );
条件高( ? : )、赋值低 ( = );逗号最垃圾( , )
四、结构与控制
1.C语言程序结构
顺序 :程序自上而下顺序执行
选择 :if() if --else if嵌套 switch() ,switch()里必须有刹车语句 break < return < exit 还需要有default ,表示其他情况如何。
循环 : for() for嵌套 while() do--while 死循环:for(;;) while(1)
2.C语言控制语句
2.1 条件判断
if() if-else if嵌套 switch() break(跳出循环)
2.2 循环语句
while() do-while for() goto(无条件转跳) continue(关键字,跳过一次循环进入下一次)
五、数组
1.一维数组
1.1 定义与引用
数据类型 数组名[常量] //int a[10];
1.2 初始化和内存分配
部分初始化 全部初始化
连续内存空间
选择排序 简单选择排序 杨辉三角形 冒泡排序 Fibonacci数列
2.多维数组
2.1 定义及初始化
数据类型 数组名[常量][常量] 除了多一个下标其他与一维数组相同
2.2 使用与内存分配
连续存储内存空间 与一维数组相同
3.字符数组与字符串
3.1 定义与输入输出
char 数组名[常量] printf("%s\n",a) puts(a) scanf("a") gets(a) 以 ' \0 ' 结尾,非常有用
3.2 字符串处理函数
strlen() strcpy() strcat() strcmp() strtok()
//strlen()
int mystrlen(char*p)
{
int count=0;
while(*p++ !='\0')
{
count++;
}
return count;
}
//strcpy()
char* mystrcpy(char*dsp,const char*src)
{
char* q=src;
while(*dsp++=*src++);
return q;
}
//strcat()
char* mystrcat(char*p,char*q)
{
char* m=p;
while(*++p !='\0');
while(*p++=*q++);
return m;
}
//strcmp()
int mystrcmp(char *p,char*q)
{
while(*p!='\0' ||*q!='\0')
{
if(*p>*q)
return 1;
else if(*p<*q)
return -1;
else
{
p++;q++;
}
}
return 0;
}
//strtok() 是将字符串拆成单个字符
六、指针
1. 指针基础
1.1 定义赋值与使用
类型说明符 * 变量名 占内存空间4字节 指针常量NULL &:取地址符
2. 指针运算
2.1 关系与算术运算
指针与整型 :指针与整型的算数运算,表示指针移动多少个位置
指针与指针:必须是同类型且指向连续存储的对象才有意义,否则无意义,浪费时间。指针与指针的算数运算,表示二者的间隔数: (p[4] -p[1]) /sizeof(int) =12/4=3 即指向 p 指向 a[3] 。
值: 地址:
a[i]=p[i]=*(a+i)=*(p+i) a+i = p+i = &a[i] = &p[i]
2.2 空指针 NULL
NULL是指针变量唯一的常量,指针是一把双刃剑,用的好就是非常好用的工具,反之则可能会造成严重后果,这便是野指针,可能指向一些系统重要文件,不小心更改就会可能导致程序、系统崩溃,在编程中应当去避免。
指针变量初始化时,暂时无法确定指针变量的指向可将之赋值为NULL 避免野指针。
3. 指针、数组、函数
3.1 指针与一维数组
在传递参数时,常用地址传递与值传递 地址,传递可改变实参变量的值而地址传递着不行
#include <stdio.h>
//int* p = &a;
void setA(int* p)
{
*p = 200;
}
int main()
{
int a = 10;
setA(&a);//地址传递
printf("a is %d\n",a);
return 0;
}
#include <stdio.h>
int a(setA) = a(main);
void setA(int a)
{
a = 200;
}
int main()
{
int a = 10;
setA(a);// 值传递
printf("a is %d\n",a);
return 0;
}
3.2 指针与多维数组
int a[3][5]; int (*p)[5] //
遍历二维数组
3.3 指针与函数
int find (int *) int (*p)(int*) void*
4. 多级指针
4.1 定义与引用
int *q=NULL; int **p=&q;
4.2 多级指针运算
七、函数
1.函数基础
1.1 定义声明
实现具体功能的代码段被封装 命名规则 声明
1.2 调用与传递
值传递 地址传递 全局变量传参 返回值
2.指针函数与函数指针
2.1 定义使用与声明
2.2 函数指针类型与数组
int (*p)(int) int p(int)
3.递归与回调函数
3.1 递归定义与说明
3.2 形式与条件
3.3 回调定义与机制
3.4 递归回调使用实例
八、自定义数据类型
1.结构体
1.1 定义、声明及使用
struct 结构体名字{};
1.2 结构体数组与指针
2.位域
2.1 定义及说明
2.2 位域的使用
3.共用体与枚举
3.1 共用体
3.2 枚举定义与使用
九、C语言的高级用法
1.内存管理
1.1 动态内存管理与函数
数据类型指针p=malloc(sizeof(数据类型)) 判断是否申请成功 手动申请手动释放
2.堆与栈
3.常见关键字总结
3.1 static、const
3.2 extern、宏定义、typedef
3.3 volatile、register、memory
总结
自我思考,总结C语言基础的数据语法、函数、定义以及使用方法,例如:数制、运算符、字符与字符串、数组、常用函数、指针、结构体,将梳理C语言的整体。