C语言笔记

本文介绍了C语言的基本概念,包括硬件的正负电表示、.c和.h文件的作用、转义字符、C语言的编写步骤、基本输入输出函数printf和scanf的使用,以及变量、数组、字符串的处理。还涉及了内存管理、位运算、常量枚举、逻辑运算符和循环控制等核心概念。
摘要由CSDN通过智能技术生成

硬件要通电
电有正电和负电
正电表示1负电表示0

.c的文件是源文件
.h的文件是头文件

\' 表示单引号
\" 表示双引号
\\表示一个反斜杠
\n表示换行
\r表示回车
\t表示水平制表符,相当于按下tab键,还有一些转义字符没有提及,因为刚开始用的很少


写C语言
第一步    新建项目
      visual c++中的空项目
第二步    新建项
      源文件右键   c++文件(.cpp)
第三步    写代码
主函数
int main()
{
函数体
return 0;
}

打印前先引用
#include <stdio.h>
打印printf("要打印的内容");
打印是用十六进制打印的

%c输出字符
%d输出整数
例%2d,输出的数占两位,不足两位的时候用空格补齐1的话输出就是空格1
同样可以3d,4d这样
%f输出单精度小数
%lf输出双精度小数
%s输出字符串
%p输出地址

printf(“%c”,要打印的字符变量名字);

存字符串用字符数组
char 数组名字[]="字符串";
或者
char 数组名字[]={'例a','例b','例c','\0'}

因为字符串都是以\0结尾的
\0是字符串的结束标志

在查看数组中字符长度的时候\0不算进去,但是\0在数组中占一个位置(字符空间)
所以算数组长度的时候算进去

ASCII编码


引用放在主函数外(上面)


查看其所占内存量
sizeof(要查看的名字);
要查看的名字为类型如int等不能省略括号
为变量的时候可以省略括号
例:int double 变量名
计算的是变量或类型所占空间的大小,单位是字节

要想打印控制台能显示后能看到
右键项目名称,属性,配置属性,链接器,系统,子系统,控制台


输入函数
scanf("%数据类型例d",&要输入的变量名);
要输入复数个数据时
sancf(".....%例d",&变量名,&另一变量名,....);

getchar()输入字符
是只能输入字符的sancf版本
只能输入一个字符
对应有putchar(要打印的字符)只能输出字符
是printf的只打印字符版本

注意getchar()得到的不是字符而是对应的ASCLL码所以应该存在整形中
打印的时候可以直接把整形变量放入putchar或者用printf来打印整形但是打印出来仍是那个字符

&取地址符号
*取内容符号(解引用符)

sancf函数可能会被报错
报错就在代码第一行!第一行!
#define  _CRT_SECURE_NO_WARNINGS 1

全局变量就是在哪个函数都可以用的变量

在主函数外的变量是全局变量
如果全局变量和函数内的局部变量重名则全局变量会被覆盖

局部变量的生命周期是从创建到销毁
静态的局部变量只能初始化一次生命周期是整个程序
静态的全局变量不能被别的类使用

静态的生命周期是程序运行到结束
常量是静态的

被const修饰的变量会成为常变量
常变量的值不能被修改

常量名字要求大写

C语言定义变量要求放在函数体的最前面
否则会报错


创建数组
数组类型例int 数组名字[数组长度]={数组内容};

----------------------------------------

定义标识符常量
#define 标识符 常量
例           AAA     10

枚举常量
创建
enum 枚举名字{枚举常量1,2,....};
定义
enum 枚举名字 对象名字=枚举常量n;

----------------------------------------

中括号[]可以放标识符常量

查看字符串长度
strlen(要查看的字符串名字);

用strlen需要引用#include <string.h>

\x\xx\xxx都是系统规定默认的八进制转义字符
\后跟数字会当成八进制数字转义成字符,转后跟的数字最多三个数字
\x跟数字是十六进制数字,转X后的最多两个数字


ifelse语句和C#一样


定义数组
例int a[3];
例int a[]={1,2,3};

移位操作,移动的是二进制位,二进制的数串整体移动
左移《          右移》
例int a=1;int b=a《2;
代表把a 左移两位后赋值给b
好比b=a+2     a本身是不变的

二进制位操作
&按位与(并)
|按位或(或)
^按位异或(对应二进制位不同为真,相同为假)

位操作是是把符号拆成二进制数字串
然后对每一个bit进行位操作
真是非0假是0


!反逻辑符
会把后面接的第一个字符反逻辑

例!10
因为1是非零为真,反逻辑后假为0
所以结果是00即0

例!0结果为1


特殊!=是不等于


~二进制按位取反
会把后面紧跟的第一个字符的二进制串的0变1,1变0

二进制数串

对于分正负的数据类型时
最高位0表示是正数1表示是负数

对非正数
原码,符号位不变其他位置按位取反得到反码
补码=反码+1

正数在内存存储的时候存储的是二进制的原码
正数的原码反码补码相同

负数在内存存储的时候存储的是二进制的补码
原码是直接按照正负写出的二进制序列

只要是整数,内存中存储的都是二进制的补码

使用的打印的是这个数的原码


&&逻辑与(并)
||逻辑或(或)


判断表达式?表达式1:表达式2;
判断表达式真时读表达式一
假时读表达式2

if(判断表达式){表达式1}
else{表达式2}
的缩写

----------------------------------------

常见关键字

auto自动 
局部变量也是自动变量,每个局部变量都有auto但是可以省略不写

continue跳过本次循环
struct结构体
strict 结构体名字 对象名字={各个结构体内容}
void无,空

EOF值是-1
signed有正负的
unsigned无负的
int平时前面都有signed只不过省略了

typedef类型定义(给类型起外号)
类型重命名,例typedef int asd;
此时int类型被重命名为abc但是int仍可以用abc可以用

union联合体,共用体

extern引入外部符号
同一项目下的不同类中一个类要用另一个类的某一变量或某一函数时使用
例一个类有变量int a;
另一类引用时extern int a;
例一个类有函数,int b(int x,int y){函数体}
另一类引用时extern int b(int,int);

static静态的
被static修饰的函数和全局变量不能被其他类使用
被修饰的函数会从外部链接属性变成内部链接属性


register寄存器
例register int a=10;
这样会告诉编译器建议把该变量放入寄存器
最终放不放由编译器对寄存器的剩余和是否必要来决定
当某个变量使用特别频繁或者特别重要时可以建议放入寄存器

计算机存储
寄存器
高速缓存
内存
硬盘
由上至下,存储空间越来越大,数据传输速度越来越慢
所以寄存器空间有限,优先重要的频繁的而且大小不大的放入,大的也放不进去

volatile


注,变量名不能和关键字相同
---------------------------------------

定义宏
#define 名字(形参)(方法体)
使用宏

#define a(x,y)(x>y?x:y)
int main()
{
int m=1,n=2;
int s=a(m,n);
}
读到宏的时候会把宏的mn当实参传到方法体里然后把宏的名字和实参替换成方法体

相较函数运算更快省代码量


----------------------------------------

32/64位电脑指的是有多少根地址线/数据线
每根线都可以通电,通电就有正负电就有电脑的0或1
例三十二位电脑
00000000000000000000000000000000
到11111111111111111111111111111111
有二的三十二次方种不同的组合
每种组合对应一个地址
所以内存就有2的三十二次方个内存空间
每个内存空间容量有一个字节的大小
所以三十二位电脑内存为4G

存放地址的变量叫指针变量

int a=10;
int* m=&a;
printf("%p\n",m)
根据地址找到对应的变量
*m,此时*m就是a
*m=20;(a由10变成了20)

每个指针变量所占内存大小是该电脑位数的大小
例32位电脑,那每个指针变量占32个比特位也就是4个字节

----------------------------------------

字符串拷贝方法
给存字符串的字符数组更换存的字符串
strcpy(字符数组名字,新的字符串);
拷贝完会把新字符串结尾自动加\0
所以打印的时候哪怕后面有旧的字符也不会打印出来只会打印新字符串
这是库函数要先引用string.h


else会和离他最近的为匹配的一个if配对


switch语句中()里的变量只能说整形变量

刷新缓冲区fflush(stdin);

线程暂停sleep(暂停的时间);
时间单位是毫秒,一秒等于一千毫秒
需要引用#include <windows.h>

执行系统命令函数system("要执行的命令");
例cls清空屏幕
需要引用#include <stdlin.h>

判断两个字符串a与b是否相等strcmp(a,b);
注==不能判断两个字符串是否相等
若相等则返回0不相等返回1

define不是关键字是预处理指令

字符类型char等存的字符的ASCLL码所以实际也是整形


求两数之间最大公约数算法\(◎o◎)/!
m,n(m大于n)
while(tenp=m%n){m=n;n=temp;}
循环结束时n存的值就是最大公约数

若一个数可以写成i=a*b(i,a,b均为正整数)
那么a,b中至少一个数是小于等于i的平方根的

偶数里没有素数

sqrt(要开方的数);开平方函数
需要引用math.h

在for(定义变量,条件判断,变量改变)中
break 出循环时不会执行变量改变,continue和正常循环完都会执行一次变量改变

需要引用stdlib.h
伪随机数rand();随机生成一个0到32767之间的正整数但是随机性低明显,需要放int里

如要产生[m,n]范围内的随机数num,可用:\n\nint num=rand()%(n-m+1)+m;

真随机数srand(种子值);不给种子值会默认为1,种子值不同生成随机数的算法不同,使种子值变化会是随机数生成真正的随机
srand函数是根据种子值改变随机算法的初始值
所以要跟rand一起用
srand改变算法rand根据算法生成值

srand不要频繁调用,否则会不随机
调用一次就可以了

要使种子值不断的自动变化,可以使用时间戳

使用时间戳需要引用time.h
时间戳的类型是time_t
时间戳函数time(指针);
指针有两种方式int a=0;
NULL或0
a=time(0);

变量地址
time(&a);

第一种是空指针过去然后返回值赋值给变量
第二种会自动赋值给变量

----------------------------------------

系统命令函数system("要运行的函数");
设置关机
shutdown -s -t 关键倒计时单位为秒;
shutdown -a;取消关机


memset数组中部分数值的替换
memset(数组名字,'要替换成的字符',替换的长度)
set设置
memory内存
例int a[]="hello world";
memory(a,'*',5);
然后数组a会变成"***** world"
打印出来也是这样,这个函数不会给他添\0


函数的调用有两种
传值调用
把值当实际参数传过去
形式参数是实际参数的临时拷贝,会新建一块空间给形式参数存,所以形式参数实际参数地址不同,改变形式参数实际参数不改变的!
传址调用
把地址当成实际参数传过去
因为传过去的是实际参数的地址,所以解引用后形式参数就相当于实际参数了,实际参数随形式参数一起改变
注意,数组本身就是地址,传数组就是传址


函数间可以相互调用
传给函数的实际参数可以是函数的返回值

函数的规范声明和定义
声明要新建一个头文件放函数声明
声明例
#ifndef  __ADD_H__
#define  __ADD_H__
int add(int,int);
#endif

三句#号是为了防止重复引用,养成习惯每个头文件都要有
定义要新建一个源文件放定义
定义例
int add (int x,int y){int z=x+y;return z;}
主函数那里要使用时引用一下存这个函数的头文件就可以了
引入自己的头文件用“”引入库函数的头文件用<>


printf的返回值是int类型,具体返回数值是返回打印了几个字符,打印一个叫返回1打印一百个就返回100


栈里放局部变量和函数形式参数和函数的调用
堆里放动态开辟的内存,malloc,calloc
静态里放全局变量和static修饰的变量

栈溢出stack overflow


数组名是首元素地址(放在sizeof函数中时除外)
&数组名,取出的是整个数组的地址
sizeof求整个数组占内存大小,单位是地址
数组传参传过去的不是整个数组,是第一个元素的地址
数组名字++;
代表现在是第二个元素的地址了

取到的地址是首元素的或者数组开始的地址
加加得到的不一样
首元素地址加加得到下一个元素的地址
数组的地址加加得到下一个其他变量什么的地址

所以直接数组名字的地址和取数组名字地址后的地址虽然地址显示一样但是涉及到的范围不同,第一个是涉及整个数组第二个是涉及整个元素

strlen遇到\0才停不然随机数
sizeof要算上\0

二维数组例
数组名字[有几行][有几列];
定义声明使用和普通数组相同。


小写字母和大写字母的ASCLL码值差32
for循环在只有一句的时候{}可以省略

移位分为算数移位和逻辑移位
算数移位左边补符号位右边丢弃
逻辑移位左边补0右边丢弃

数组是传地址,指针学的时候教接收地址的是指针变量,是指针。所以函数调用传数组的时候结束数组的其实是一个指针

&&一旦遇到为假右边便不在判断和执行
||一旦遇到真就停止
&&一旦遇到假就停止

整型提升
例字符变量打印的时候用%d
这时候会隐式类型转换
把变量原码拿出来然后因为int占四个字节char一个字节在高位补齐,补的是char原码的符号位,使用完转换回去的时候从低位数数八位


正数的原码反码补码相同
负数的反码是原码的按位取反,补码是反码加一

操作符具有结合性和是否控制求值顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值