3W字带你C语言入门即精通-最新更新截至5.22

** 如有错误,感谢指正**

如有错误,感谢指正,请私信博主,有辛苦红包,拜“一字之师”。

请根据目录寻找自己需要的段落

多看手册!!!
写代码的过程
编写: 程序员写代码的过程 让程序员看懂 (.c)
编译器:查看代码的语法错误,生成汇编语言。(.obj)
汇编器:将生成的汇编语言 生成二进制语言(目标文件)
连接器:将生成好 二进制语言+用到的库+启动代码 ====》可执行文件.exe

进制转换:本文不再讲解。

二进制 八进制 十进制 十六进制 都是整型的输出形式 不同进制 仅仅是数据的表现形式 不会修改数据本身
二进制0-1
八进制0-7
十进制0-9
十六进制 0-9 A-F

一些小应用
%p 输出地址
%d 十进制整形输出 有符号int数据输出
%o 八进制
%x 十六进制
%ld 有符号 long整型数据输出
%lu 无符号 long整型数据输出
%hd 有符号 short数据输出
%hu 无符号 short 数据输出
%c字符输出 单个字符
%s 就是输出字符串
%f输出float数据 scanf(“%f”, &f);
%lf 输出double数据 scanf(“%lf”, &d);
%u 无符号整型输出 %p 指针的值

浮点数的特殊表示
%5d 表示占5个终端位宽右对齐
%-5d 表示占5个终端位宽左对齐
%05d 表示五个位宽右对齐,空的补0 // %-05d 不能这样写 不起作用 会有歧义
%5.2f 5表示总位宽 .2 表示小数位保留2位
%.2f 表示 小数点后保留两位

使用任何东西,必先存在之关键字

数据类型关键字 12个 char short int long float double unsigned signed struct union enum void

控制语句关键字 12个 if else switch case default for do while break continue goto return

关键字4个 auto extern register static const

其他关键字 3个 sizeof typedef volatile

保留字未记录

区分关键字的原因
给用户合理分配利用空间
一个字节 bit=8b位二进制 0000 0000 — 1111 1111 1KB=1024B (1MB 1GB 1TB 1EB)

32位平台
char 字符型 1个字节 short 短整型 2个字节 int 整型 4个字节 long 长整型 4个字节
long long 有的支持 有的不支持 8字节 float 单精度浮点型 四字节
double 双精度浮点型 8字节
案例 验证数据类型长度 sizeof:测量类型的长度

sizeof有三种语法形式,如下:

  1. sizeof( object ); // sizeof( 对象 );
  2. sizeof( type_name ); // sizeof( 类型 );
  3. sizeof object; // sizeof 对象;
#include <stdio.h>
void main(){
   
void main() {
   
	int a;
	short char b;
	unsigned u;
	char e,f,g;
	long int c;
	e = sizeof(a);//b,c,u,e
	printf("sizeof(a)=%d",e);
	f = sizeof(int);
	printf("sizeof(int)=%d",f);
	g = sizeof int;
	printf("g=%d",g);
	printf("sizeof int=%d",sizeof(int));
}

64位平台
long型占8字节 其他都一样

unsigned 无符号数 数据没有符号位 自身所有二进制位都是数据位
signed 有符号数 默认一般省略 二进制最高位为符号位 其他位为数据位。 最高位为1表示负数 0表示正数
signed char 范围 1111 1111 -1000 0000 ~ 0000 0000 -0111 1111 /-10 == 1000 1010

结构体struct和公共体union
struct 结构体中的成员拥有独立空间
union 共用体中的成员 共享同一份空间

enum 枚举 将变量和要赋的值一一列举出来
enum BOOL {false,true};
enum BOOL bool = false;
void 无类型(重要)
不能用 void定义变量

auto 自动类型 /c中地位很低 c++ 有用
register 寄存器变量 如果没有表面register 但被高频繁使用 系统也会放入寄存器中
static 静态变量
const 只读变量

sizeof 测类型大小
typedef 为已有的类型 重新取个别名
volatile 防止编译器优化

常量与变量

1.为什么需要变量?

变量是程序组成的基本单位
变量的解释 相当于内存中一个数据存储变量的表示

常量 定义后值不能被修改(不能反着说) 整型 实型 字符串型 字符型
实型常量 123e3 e表示次方
不以f结尾的 实型常量 为double类型 float f=3.14f
以f结尾的 实型常量 为float类型

字符常量
直接常量 用单引号括起来的 ‘a’ ‘d’ 字符在计算器中存储的是ASCII值
char ch =‘a’ 本质上存储的是‘a’的ASCII值
转义字符 \开头的字符 \n 换行 \t tab制表符 \ 输出\ \0 ==》 0 “0” 字符串的地址编号 但这两个存储一样
赋0标准方式 c=’\0’

str %d ASCII值 %c str本身 字符串作为类型 代表字符串占空间大小 作为地址 代表str 首地址
系统会在字符串末自动添加一个\0 即 “a” 包括 ‘a’ 和 ‘\0’
‘ ’ 取字符串ASCII值 “” 取得是首元素地址
%s 从首元素开始 逐个输出\0结束输出
注:此处的str是指定义如 char str=abc;非str数据类型

变量 系统根据变量的类型 开辟对应空间 值可以被修改 变量名代表空间的内容 操作变量就是对空间内容的操作 先 声明 =》 再赋值 =》后使用

1.变量表示内存的一个存储区域(不同数据类型,占用大小不同)
2.该区域必须有自己的变量名和类型
3.变量必须先声明后使用
4.变量在同一作用域内不能重名
5.该区域的数据可以在同一范围内不断变化
6.变量三要素(变量名+值+数据类型)
7.不同编译器版本对变量定义的要求不一样,c89要求变量定义在语句之前

变量名的命名规则 不能以数字开头 由字母数字下划线构成

1.不允许用关键字
2.所有宏定义,枚举常数,常量(只读变量)全用大写字母用_分割单词
3.定义变量不要忘记初始化
4.变量名,方法/函数 名:小驼峰 大驼峰

数据类型

/*
深入了解请看不同系统的开发手册,不一样的,跟底层硬件关系太紧密,不同硬件不一样,linux跟win差别挺大
基本类型
	数值类型 默认都是有符号的signed和unsigned 大小都要范围,不要溢出,自己百度范围,不同系统不一样,越界值会变
		整型	short
				int 
				long 装不下了才用long long 等组合 输出用 %lld
		浮点型	float
				double
	字符类型	 char

C89没有定义Boolean
0表示False
非0表示True

构造类型
	数组 arr
	结构体struct
	联合体union
	枚举类型enum
	
指针类型

空类型 void
PS:1.C语言中没有string 用字符数组代替
	2.不同位系统中相同数据类型的字节数可能不同(如:int 自行百度)
*/

浮点型

浮点型 两种写法
1.十进制 float=3.2
2.科学计数法 float=5.12e2(-2) // e表示多少次方
用精度较大的值 建议尽量用double

char类型

ASCII介绍

整型变量的操作 【读、写】 ==》赋值/取值-操作
局部变量不初始化 内容随机
scanf(“%d”,&data); &data代表是data对应空间的起始地址 只能提取一个字符 scanf(“%c”,&ch)
ch = getchar() 获取一个字符

typedef 为已有的类型重新 取个别名
1.用已有的类型 定义一个变量
2.用别名 替换 变量名
3.在整个表达式的前方加上typedef

const简述

语法结构:const 数据类型 常量名=常量值;
const 关键字
修饰变量 作用是 只读不能修改
作用范围 本文件全局 从声明之末尾 但不能跨文件 如果要跨文件 需要extern
但是 如果知道地址可以间接修改 不通过变量名

const int p
const 在
左边 表示cosnt 修饰的是* 而不是p
效果:用户不能借助*p更改空间内容 但是p可以指向其他空间(*p只读 p可读可写)

int const p;*
const在右边 表示 const 修饰的是p
用户 可以通过
p 修改p所指向的空间内容 但不能更改p的指向(*p可读可写 p只读)

*const int *const p;(p p 都是只读)

define宏定义

#define 名 值
写在最前面,用作替换

define和const区别

1.const定义常量时,带类型;define不带类型
2.const是在编译,运行的时候起作用;而define是在编译的预处理阶段起作用
3.define只是简单的替换,没有类型检查,简单的字符串替换会导致边界效应(想把后面当整体得加括号)
4.const变量可以进行调试,define是不能进行调试(编译阶段已替换,调试时没有它)
5.const不能重定义,不可以定义两个相同的常量;而define可以通过undef取消某个符号的定义,再重新定义
6.define可以结合#ifdef,#ifndef和#endif来使用,让代码更灵活

数据类型转换

自动转换 占用内存少的类型转占内存多的/精度低的转精度高的
数据精度大小排序自行百度查询
有符号和无符号参加计算时 会把有符号转为无符号 (补码) 很大的数
int 和double 一起算会先把int转double
char 和 short 转换 因为char short自身字节数少 很容易溢出会自动转int 防止数据丢失

强制类型转换 :精度高的转精度低的
(类型说明符)(表达式) /只是临时转换 当前语句有效 不影响原值,返回新值
不是四舍五入 是直接截断
栗子:

float x = 3.94f;
int j =0;
j = (int)x; //3

只对最近的数有效 想要转更多用()

int num2=(int)(10.655.1+62.3)
int num3=(int)10.256545+564.34

运算符

算数运算符 + - * / % ++  -- 正负号
赋值运算符 = += -= *= /= <<= >>= &= |=
关系运算符(比较运算符) >  <  >= <= != ==
逻辑运算符 && || !
位运算符<<  >>  &  | ^  ~
三目运算符   表达式? 表达式1 :表达式2

1.算数运算符 + - * /取整 %
/ 取整 a/b ab都是正数的时候 取整 除法“%f\n”,5/2.0f
% 取余
a % b = a - a / b *b
算数运算有可能数据损失,如:int 10/3=3而 float=3.333333~,提升数据精确度解决

++ – 运算符 ++i --i 先算后值 i-- i++ 先值后算

2.关系运算符 > < == >= <= !=

3.逻辑运算符! && || 注意短路现象
!逻辑非 0为假 其他都为真
短路现象 &&一假全假 遇假不再执行
|| 一真全真 遇真不再执行

4.位运算符 << >> & | ~ ^
&按位与 语法 全1为1 其他为0 和1相遇 保持不变 和0相遇 清零 // 底层清零用
| 按位或 语法 有1则1 全0为0 和0相或 保持不变 和1相或 置1 // 将固定位置1
~按位取反 语法 0变1 1变0 配合 & | 操作
^按位异或 语法 语法 相同为0 不同为1 与0异或保持不变 和1异或取反 // 将固定的位 发生高低电频翻转
如:

1010 1010
0000 1111
-----------
1010 0101

左移运算符<< 多的丢弃 少的补0 移动位数 不要超过自身的长度

右移运算符>> 溢出的丢弃
逻辑右移:右边丢弃 左边补零
算数右移:无符号数右边丢弃 左边补零
有符号数
正数 右边丢弃 左边补0
负数 右边丢弃 左边补1
逻辑右移和算数右移 是编译器决定的 但是我们可以检测
data = data & ~(0x01 << 5 | 0x01 <<1); 清零操作 没有~是置1

5.赋值运算符 (= 及其扩展赋值运算符)
(a +=b )==( a = a + b)

6.三元运算符(?:)
一真大师/条件表达式为1(真)表达式1执行
可以转化为if-else语句

7.逗号运算符(,) 优先级最低

8.指针运算符(*和&)

9.求字节数运算符(sizeof(变量或常量))

10.强制类型转换运算符((变量或常量))

11.分量运算符(.->)

12.下标运算符(【】)

13.其他(如函数调用运算符();)

优先级 : 优先级高的先执行,不同优先级看结合性 自己写尽量加()
自己百度,记不住就加括号提高优先级,不需要刻意去记,多用就会了
算术运算符 > 关系运算符 > 逻辑运算符(逻辑非除外) > 赋值运算符 > 逗号运算符
同级中 .高于* 【】高于* 函数()高于* ==和高于位操作和赋值 算术运算符高于位运算符

if语句

1.只在乎项目的一个结果 选择if

if(表达式)
{
   
     语句1}表达式为真 执行语句/代码块   

*if-else语句	如果有两种不可能同时存在的情况*
if(表达式)
{
   
   语句1}else
{
   
   语句2} 表达式为真 执行语句1 为假 执行语句2

*if - else if -else语句  如果有多个结果且不同时出现*
if(表达式1{
   
   语句1}else if(表达式2{
   
   语句2}else if(表达式3{
   
   语句3}
else   // 可省略
{
   
   语句n;
} 表达式几成立 执行语句几 满足哪个条件,执行哪个语句 按顺序 满足一个就跳出判断 不再看后面的 
前面都不满足执行else的语句  每个if语句是独立的

switch语句

switch(表达式)
{
   
case1// 不能是实型,字符串   只能是整型数值
    语句1break//大多数都要break  少数不用break 比如当两种情况需要执行的代码块一样时 省略一对语句与break
case2:    值可以写|| 这种 不报错 但是可能跟自己相要的效果不一致
    语句2breakcase3:
    语句3breakcase4:
    语句4breakdefault//可以省略
   语句n;
   break}与哪个值同 执行哪个下面的语句 break跳出 如果都不同 执行default下的语句然后跳出

for循环

for(初始语句;循环条件;步进条件)
{
   
   循环语句
}
初始语句:循环开始时执行一次    // 如果变量提前初始化了 可以省略
循环条件:每次循环都要执行 循环条件为真 进入循环 为假退出循环 // 如果省略了 必须在循环语句中实现退出
步进条件: 每次循环结束时 要执行的语句  // 也可以省略 在循环语句里实现步进动作 否则就是死循环

break 只能跳出离它最近的一层循环
continue 推出单次循环 继续执行下次循环

while循环

while(循环条件)
{
   
  循环语句;
}  条件为真 进入循环体 执行循环语句
	while没有步进语句和初始化语句 需要提前初始化和写好退出循环的条件

do {
   
  循环语句
}while(循环条件) ;
先执行循环语句 再判断条件 为真执行下次循环 为假 跳出循环

goto 跳转锚点
goto here;
here:

数组

: 为了方便 将具有相同类型的若干变量按有序形式组织起来—成为数组
数组属于构造数据类型
按照元素不同 分为 数值数组 字符数组 指针数组 结构体数组

一维数值数组
定义:需求 请定义一个数组 该数组有10个元素 每个元素为int
在定义的时候 a.arr【】 arr和【】结合是数组
b.将确定的元素的个数放入【】中
c.用元素的类型定义一个普通变量
d.从上往下整体替换。
int arr【10】;

数组名arr不能和其他变量名重名
数组的元素下标是从0开始:0-9
数组的元素分别是:arr【0】、arr【1】~arr【9】访问数组【10】越界
数组的元素等价于普通变量
在定义数组的时候,【】里面的值 不能是变量。
局部数组如果不初始化 内容不确定

初始化 定义时给变量或数组元素赋值的动作叫初始化
全部初始化int arr=【5】={1,2,3,4,5}
部分初始化 未被初始化 部分自动补0
初始化操作常用操作 将数组所有元素清零 int arr【5】={0} // 值初始化arr【0】=0 其他补零
int arr【5】={2} // 2 0 0 0 0
扩展:初始化 int arr【5】={【2】=3,【4】=7}
数组占内存大小 靠内容撑开 = 元素的个数*每个元素的大小
重要事项 int n= sizeof(arr)/sizeof(arr[0]) 通用获取数组元素个数

二维数组 int arr[n][n];
二维数组 初始化 分段初始化int arr【3】【4】={ {1,2,3,4},{5,6,7,8},{9,10,11,12}}
连续初始化:放满一行 才能放下一行int arr 【3】【4】={1,2,3,4,5,6,7,8,9,10,11,12}

字符数组 char arr[];
初始化 char str=[‘h’,‘l’,‘l’] 逐个初始化 不推荐
char str[6]=“hello”; 以字符串的形式 初始化 推荐
遍历 逐个遍历 不推荐 printf(“%c”,st[i])
整体遍历 推荐 printf(“%s\n”,str)
重要:一维数组名代表的是数组的第0个元素的地址,必须记住

逐个字符初始化和整体初始化的区别
逐个 是多少就是多少 系统不会认为是str
整体 最后会有个\0 系统认为是str

scanf和%s使用的时候,有个缺点,遇到空格会结束输入

gets(buf); 获取带空格的字符串 缺点:获取键盘输入的时候 不会管buf 的大小,容易造成内存污染

fgets函数 既可以获取带空格的字符串,也可以保证buf不越界


> char *fgets(char *s , int size ,FILE *stream) 	s表示存放字符串的空间地址 	size
> 能够提取字符串的最大长度 size-1 最后一个存\0 	stream stdin 表示标准输入设备 	返回值 获取到的字符串的首元素地址
> char buf[10] = "";

printf("shuru")
fgets(buf,sizeof(buf),stdin);
printf("buf=%s\n",buf);   打包到一个函数

> ASCII 小写变大写 -32

二维字符数组 char str[2][6]={"","",""};
不管是数值还是字符的二维数组,在初始化的时候,可以省略行标(第一个参数)行数由具体初始化决定
第二个参数是该行大小

库函数

自定义函数

函数类型 函数名(形参类型 参数名)
{
   
   数据定义部分;
   执行语句部分;
}函数类型: 函数返回值类型 默认int

函数定义:实现函数功能、确定函数体、返回值类型、形参类型。让函数存在 函数声明:不是实现函数功能 仅仅说明函数返回值类型、形参类型、函数名
函数调用:函数的执行

函数定义
返回值类型 函数名(形参类型 形参){
函数体;
}
返回值类型:函数将来返回值的类型
函数名:函数的入口地址
形参:函数外部数据 传递到 函数内部的 桥梁
函数体:具体的函数功能带

函数声明:返回值类型 函数名(形参类型 形参) 告诉编译器 函数存在 请通过编译

函数调用:函数名(实参);

  • 18
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨竹菊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值