C语言笔记
c语言基本概念
-
程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构
-
算法:可以没有输入,但是一定要有输出。
-
先编译,后链接,最后运行 .c—.obj—.exe
-
C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理
-
e前e后必有数,e后必为整数
-
赋值表达式:表达式数值是最左边的数值
-
强制类型转换 一定是 (int)a
-
大写字母和小写字母转换的方法: ‘A’+32=‘a’ 或则
-
一般转义字符:背诵\0、 \n、 \’、 \”、 \。
-
四舍五入: y=(int)(x*100+0.5)/100.0 这个保留两位,对第三位四舍五入
-
!>&&>|| 优先的级别。 非>与>或
-
函数不可以嵌套定义。但是可以嵌套调用。
-
数组名不可以自加,他是地址常量名
-
算术表达式
-
c语言简单的数据类型:整形 实行 字符型
-
%两边必须为整型数据 A%B正负号看A
-
优先级:() ± 单目 * / % ± 双目
-
float小数部分为6位数
-
赋值 变量名=表达式
-
逗号表达式: 表达式1,2,3 最后的值为最后一个
-
数据的输出
-
%d十进制, %0 八进制 %x十六进制 %f小数
-
%md 一共m位,不够的左边补空格
-
%n1.n2 n1表示一共多少位(小数点也算一位),n2代表小数位
-
输出的过程 是右往左<-- eg: i=8; printf(“%d %d\n”,i,++i); 9 9
-
指定位宽: % * .d ,m,f 表示把*替换成 m
-
数据的输入
-
scanf(“%d”,&a);
-
两个数值之间可以空格 制表符 回车
-
scanf %*d 表示跳过这个数的输入
-
关系运算
-
逻辑运算: &&与 || 或 ! 非
-
短路现象: A && B 如果A是假的 那就不执行B 全部真才是真
A || B 如果A是真的 那B不执行了 有一个真就是真 -
三目运算 表达式1 ?2:3 当1是真的执行2,假的执行3
-
循环结构
-
while循环 while(表达式) 循环体; 当表达式为真执行循环体 例如 while循环求1-100
#include<stdio.h>
int main(){
int s=0,n=1;
while(n<=100) {
s+=n; n++;
}
printf(“%d\n”,s);
} -
do while语句
do
循环体
while(条件);
// do while求斐波那契,
#include<stdio.h>
int main(){
int t,t1=0,t2=1;
do{
t=t1+t2;
t1=t2;
t2=t;
}while(t2<=1000);
printf(“%d\n”,t);
} -
for语句
for(表达式1;2;3) 执行顺序 先初始化1,然后判断条件2 再执行循环体,最后执行表达式3
for循环使用范围:知道要循环多少次
while循环:知道结束条件
-
break和continue
break:终止本层循环#include<stdio.h> #include<math.h> int main(){ double a,x0,x1; scanf("%lf",&a); //2.计算x0和x1 x0=a/2; x1=(x0+a/x0)/2; //3.判断条件 while(fabs(x0-x1) >= 1e-5){ x0=x1; x1=(x0+a/x0)/2; } printf("%f的平方根是%f\n",a,x1); return 0; }
-
字符型
-
字符常量: 单引号 ‘A’ 只能是一个字符
-
\r 是回车不换行,\n是回车换行
-
字符串常量: 双引号 ”DSFSDF“ 结尾是\0
-
字符变量 char cj;
-
getchar(); 可以接收键盘上面额空格和回车键
-
库函数
-
头文件
输入输出 #include<stdio.h>
数学 math.h
字符 ctype.h
字符串 string.h
内存 stdlib.h
-------------------------------------------------------‘
abs()、 sqrt()、fabs()、pow()、sin() 其中pow(a,b)是重点。23是由pow(2,3)表示的。 -
如果把自定义函数放在main后面,则需要在头文件下面加函数声明。
素数
//如果n能被2至n-1的任意一个数整除,则n不是素数
#include<stdio.h>
int fun(int);
int main(){
if(fun(9)){
printf("素数\n");
}else printf("不是素数");
return 0;
}
int fun(int n){
int k,y;
for(k=2;k<=n/2;k++){
if(n%k==0) {
y=0;
break;
}
else y=1;
}
return y;
}
-
地址和指针
-
指针变量存放地址
-
指针赋空值
int *p; p=NULL; p=0; p=‘\0’; NULL的值为0 -
指针位移
J = *P+1 = K+1 ; 给变量加1
++*P <—> ++K
(*P)+1 <-----> K++;
*P++ <-----> *(P++) 原址int a[]={10,20,30,40,50},*p,i;
p=a;
当指针不移动情况下,数组任意一个元素如下表示:a[i] *(a+i) p[i] *(p+i)
移动情况下,数组名是地址常量,数组名不能自增减操作。指针的移动:p++ p–
for(p=a;p<a+5;p++) printf(“%d\t”,*p); //使用指针便利数组
p=a+1 等价于 p++ 指针 元素后移一位 变成a[1]
(*p)++ 是先取指针的内容然后内容自加1
*(p++) 是先取原址的内容,然后指针后移 -
二维数组
-
类型名 数组名【行】【列】 ,下标可以是整形常量表达式 行可以省略
-
字符串
-
每个字符串都\0结束
//字符串的输出
1. 字符串常量: printf("%s\n","l love you");
2. 字符数组名: char str[]="l love you"; printf("%s\n",str);
3. 字符指针: char str[]="l love you" ,*p=str; printf("%s\n",p);
//字符串的输入
1. 字符数组名: char str[10]; scanf("%s",str);
2. gets 输入: char str[15]; gets(str); //可以输入空格 puts(str); 自动换行
//字符串处理函数: #include<string.h>
1. strcpy(s1,s2); 把s2赋值到s1里面 函数返回的是s1
2. strcat(s1,s2); 把s2的内容连接到s1后面并且自动覆盖s1的\0,返回s1的地址值
3. strlen(s1); 计算s1字符串的长度 不包含'\0'
4. strcmp(s1,s2); 字符串比较 当s1>s2 返回大于0的数,两个相等 返回0 s1<s2返回负数
-
字符串求长度
#include<stdio.h>
int length(char *s);
int main(){
char s1[100]=“”;
int len;
puts(“请输入一串字符串:”);
gets(s1);
len=length(s1);
printf(“字符串的长度为:%d\n”,len);
return 0;
}
int length(char s){
int n=0;
while((s+n)!=‘\0’) n++;
return n;
} -
字符串复制
/**
- @file 字符串_复制.c
- 不用库函数,使用指针完成字符串的复制
*/
#include<stdio.h>
void _copyStr(char *s1,char *s2);
int main(){
char s1[]=“you are very good!”;
char s2[]=“”;
_copyStr(s1,s2);
printf(“复制之后的字符串为:%s\n”,s2);
return 0;
}
void _copyStr(char *s1,char *s2){
while (*s1!=‘\0’){
*s2=*s1;
s1++;
s2++;
}
*s2=‘\0’; //在s2末尾添加结束标志
} -
编译预处理
-
宏定义和调用 #define N 30
特点:原处替换,一改全改 可以嵌套定义
宏替换不考虑数据类型 -
文件包含、
include<stdio.h> 包含头文件的目的是为了引用某些库函数
预处理是占用的编译时间,不是运行时间,
-
结构体和共用体
-
结构体
-
定义
#include<stdio.h>
struct stu{
int age;
int sex;
char name;
}*p;
int main(){
struct stu x={1,‘s’,21.0};
p=&x;
printf(“%d”,x.age);
printf(“%d”,p->age);
return 0;
} -
引用
变量名.成员名 指针->成员名 -
占用内存大小
注意结构体的对齐,既是每次都多加3 -
带参数的调用
#include<stdio.h>
struct stu{
int age;
char sex;
float b;
};
void stu(struct stu s){
printf(“%d”,s.age);
}
void point(struct stu *p){
printf(“%d”,p->age);
}
int main(){
struct stu x={1,‘s’,21.0};
struct stu *p=&x;
stu(x);
point§;
return 0;
} -
共用体
-
占内存大小
所有成员共用一个空间,大小由共用体内的最大字节 所决定
- typedef
功能是取别名, typedef 已有的数据类型 别名;
//typedef的意思是取别名,如果不加typedef则结构体后面的是变量
#include<stdio.h>
typedef struct stu{
int age;
char sex;
float b;
}STU;
int main(){
STU s1,*P;
return 0;
}
- 内存分配stdlib.h
malloc(); free()
-
定义
#include<stdio.h>
#include<stdlib.h>
int main(){
int *p=malloc(sizeof(int));
if(p==NULL) printf(“内存分配失败\n”);
if(p!=NULL) printf(“内存分配成功\n”);
printf(“%d”,p);
free§;
return 0;
} -
单链表
-
创建