一、如何写C语言代码
1.编译器
2.创建项目
3.创建源文件
4.写代码
5.编译+链接+运行
项目名字不要汉语,不要特殊字符,不要加空格,项目路径一般为你想要的路径
C语言中,一般创建.c源文件,.h头文件
二、第一个C语言代码
首先写主函数
int main(){return 0;}
大括号:函数体
#include<stdio.h>int main(){printf("hehe\n");return 0;}
printf:专门用来按照某种指定格式来打印的C语言提供的库函数
库函数的使用得包含对应头文件
编译+链接+运行:ctrl+f5(+fn)
主函数是程序的入口,在一个工程中有且仅有一个
三、数据类型
数字:整数、小数
字符
计算机语言:人和计算机交流的语言
数据类型:char,short,int,long,long long,float,double
sizeof(char)=1byte
sizeof(short)=2byte
sizeof(int)=4byte
sizeof(long)=4byte
sizeof(long long)=8byte
sizeof(float)=4byte
sizeof(double)=8byte
计算机中单位:
bit—比特位,存放一个二进制位
byte—字节,1byte=8bit
自己可以创造类型,自定义类型
类型用于创造变量
四、变量、常量
1.全局变量
定义在大括号外部
2.局部变量
定义在大括号内部
局部变量和全局变量名字冲突的情况下,局部变量优先
3.变量的使用
五、#define _CRT_SECURE_NO_WARNINGS 1
vs scanf
六、变量的作用域和生命周期
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程
局部变量的生命周期是进入作用域生命周期开始出作用域生命周期结束
全局变量的生命周期是整个程序的生命周期
七、常量
1.字面常量
int main(){20;3.14;'a';//字符常量"abcdef"//字符串常量int a=10;//字面常量给a赋值}
2.const修饰的常变量
const是一个C语言的关键字
int main(){int num=10;printf("%d\n");//10num=20//可以被修改说明是变量printf("%d\n");//20const int num=10;//const是常属性的意思num=20;//改不了,代码是错的}
num还是变量被const修饰后在语法层面上无法改变,但实质上还是变量
int main(){int n=10;int arr[n]={0};//编译不了报错n是变量[]里需要常量const int n=10;int arr[n]={0};//编译依旧报错,说明n不是常量,不能使用在数组定义时指定大小,n是常变量}
3.#define定义的标识符常量
#define M 100//M是标识符常量int main(){int a=M;printf("%d"\n);//100int ar[M]={0};//可以,M就是常量}
4.枚举常量
枚举:一一列举
性别:男,女,保密
三原色:红色,绿色,蓝色
星期:1 2 3 4 5 6 7
C语言提供了一个枚举类型
enum sex{//枚举常量 MALE,//0FEMALE,//1SECRET//2};enum color{RED;//0默认的GREEN;//1BLUE;//2};int main(){enum sex s=MALE;printf("%d %d %d\n",RED,GREEN,BLUE);//0 1 2}
八、字符串+转义字符+注释
1.字符串
C语言没有字符串类型
字符串:“ ”引起的一串字符,结束标志‘\0’
//strlen库函数引头文件#include<string.h>int main(){char ar1[]="abc";//监视窗口 a b c \0char ar2[]={'a','b','c'};//监视窗口a b cchar ar3[]={'a','b','c','\0'};//abc自己放了\0结束了printf("%s\n",arr1);//abcprintf("%s\n",arr2);//abc烫烫烫(随机值)没有结束标志不确定c后面是什么不确定什么时候遇到\0printf("%d\n",strlen(ar1));//3printf("%d\n",strlen(ar2));//15随机值printf("%d\n",strlen(ar3));//3}
字符串的末尾隐藏了一个\0
strlen可以求字符串的长度,计算的是\0之前出现的字符的个数
2.转义字符
三字母词
??)——>[
??(——>]
如果打印(are you ok??)在?前加\,现在已经没有三字母词了
%d打印整型
%s打印字符串
%c打印字符
int main(){printf("%c",''');//打印不了printf("%c",'\'');//转义打印'printf("%s","\"");//"printf("c:\test\test.c");//\t水平制表符c: est est.cprintf("c:\\test\\test.c");//转义了c:\test\test.c }
\ddd:ddd表示1-3个八进制数字
\xdd:dd表示2个十六进制数字
printf("%c\n",'\130');\\X
printf("%c\n",'\x31');\\1
ASCII编码
\130代表把八进制130转换成十进制后得到的88作为ASCII码值代表的字符
(130)8=8^0*0+8^1*3+8^2*1=(88)10,X的ASCII值是88
\x31:表示把十六进制31转换成十进制后得到的49作为ASCII码值代表的字符
printf("%d\n",strlen("c:\test\628\test.c"));//14
c : \t e s t \62 8 \t e s t . c
3.注释
注释ctrl+k+c
取消注释ctrl先按k在按u
//C++注释风格
/**/C语言的注释风格,不支持嵌套
1)注释是用来解释代码的
2)注释可以注释一些不需要的代码
九、选择语句
好好学习,好offer
不好好学习,卖红薯
int main(){int input=0;scanf("%d",&input);if(input==1){printf("好offer\n");}else printf("卖红薯\n");}
十、循环语句
学习敲代码敲20000行不敲了
int main(){int line=0;while(line<20000){printf("敲代码\n");line++;}if(line<20000)printf("好好学习\n");else printf("好offer\n");}
C语言是一种结构化语言
十一、函数
int Add(int x,int y){int z=0;z=x+y;return z;}int main(){int num1=0;int num2=0;int sum=0;scanf("%d %d",&num1,&num2);sum=Add(num1,num2); printf("%d\n",sum);}
十二、数组
数组:能够存放一组相同类型的元素
int main(){int ar[10]={1,2,3,4,5,6,7,8,9,10};//下标范围0-9int ar2[100]={1};//不完全初始化默认是0printf("%d\n",ar[8]);//9int i=0;while(i<10){printf("%d ",ar[i]);i=i+1;}}
数组的下标从0开始
十三、操作符
1.算术操作符
printf("%f\n"7/3.0);//除号一端得有一个是小数
2.移位操作符
>> <<(二进制位)
3.位操作符
^ & |(二进制位)4.赋值操作符
= += -= *= /= &= ^= |= >>= <<=5.单目操作符
a+b:+双目操作符
C语言中,0表示假,非0表示真
!逻辑反操作 -负值
int a=10; int b=-a; printf("%d",b);//-10+正值 &取地址 sizeof 操作数的类型长度(以字节为单位)
int a=10; printf("%d\n",sizeof(a));//4,单位是字节 printf("%d\n",sizeof(int));//4
sizeof是操作符,不是函数
~对一个数的二进制按位取反 --前置、后置-- ++ 前置、后置++
int a=10; int b=++a;//前置++,先++,后使用 printf("a=%d b=%d \n",a,b);//11 11
int a=10; int b=a++;//后置++,先使用,后++ printf("a=%d b=%d \n",a,b);//11 10* 间接访问操作符(解引用操作符) (类型) 强制类型转换
int main(){int a=3.14;printf("%d\n",a);//3,有警告int a=(int)3.14;printf("%d\n",a);//3,强制类型转换}
6.关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”7.逻辑操作符
&& 逻辑与 ||逻辑或8.条件操作符
exp1 ? exp2 : exp39.逗号表达式
exp1, exp2, exp3, …expNint main(){int a=3;int b=20;int c=0;int d=(a-=3,b+=a,c=a-b,b=a-4);// a=0,b=20,c=-20,b=-4,d=-4 }
逗号表达式:表达式从左向右依次计算,整个表达式的结果是最后一个表达式的结果
10.下标引用、函数调用和结构成员
[] () . ->arr[5]=9;//[]x=下标引用操作符,他的操作数:数组名,下标
int get_max(){if(x>y)return x;else return y;}int main(){int m=get_max(3,5);//()函数调用操作符,他的操作数是:函数名,3,5}
11.常见关键字
C语言关键字是语言本身预先设定好的,用户自己是不能创造关键字的
auto:自动的,自动创建,自动销毁
break:switch,for,do while,while
case:switch
char
const
continue
default
do
double
else
enum:枚举关键字
extern:声明外部符号
add.cint g_val=;//全局变量
test.cint main(){printf("%d\n,g_val);//报错}
test.cextern int g_val;int main(){printf("%d\n,g_val);}
float
for
goto
if
int
long
register:寄存器
int main(){int num=10;//4个字节register int num2=20;//建议将20放在寄存器中}
寄存器:集成到CPU上,空间小,速度快,造价高
高级缓存
内存
硬盘
网盘
return:返回,函数中使用
short
signed:有符号的
unsigned:无符号的
sizeof
static:静态的
栈区:局部变量,形式参数
堆区:动态内存分配
静态区:静态变量,全局变量,静态区的生命周期和程序的生命周期是一致的,程序结束,静态数据的生命周期也就到了。
1)修饰局部变量:
static修饰局部变量时,实际改变的是变量的存储位置,本来一个局部变量是放在栈区的,被static修饰后放在了静态区,从而导致出了作用域依然存在,生命周期没有结束局部变量就变成了静态的局部变量,出了局部的范围,不会销毁,下一次进入函数依然存在,其实是因为:static修饰的局部变量是存储在静态区的,相当于生命周期变长了,作用域并没发生变化。
2)修饰全局变量:
add.cstatic int g_val=;//全局变量test.cextern int g_val;int main(){printf("%d\n,g_val);//报错无法解析的外部符号}
一个全局符号本来是具有外部链接属性的,但是被static修饰后外部链接属性就变成了内部连接属性,只能在自己所在的源文件内部使用 ,不能在其他文件内部使用了。使用上感觉作用域变小。
3)修饰函数
add.cint add(int x,int y){int z=x+y;return z;}test.c{int a=10;int b=20;int ret=add(a,b);//警告add未定义加extern int add(int x,int y);声明来自外部的函数printf("%d",ret);}
add.cstatic int add(int x,int y){int z=x+y;return z;}test.cextern int add(int x,int y);//声明来自外部的函数{int a=10;int b=20;int ret=add(a,b);//报错无法解析的外部符号printf("%d",ret);}
一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成了内部连接属性,只能在自己所在的源文件内部使用 ,不能在其他文件内部使用了。使用上感觉作用域变小。
struct
switch
typedef:类型重命名
unsigned int num=10;
typedef unsigned int unit;
unit num 2=10;
union:联合体,共用体
void:无,空
volatile:
while
十四、#define定义常量和宏
1.#define定义常量:
源文件:
#define MAX 1000int main(){int m=MAX;printf("%d",m);}
源文件 预编译 编译 汇编 链接 运行
预编译:
#define MAX 1000int main(){int m=1000;printf("%d",m);}
2.#define定义宏:
源文件:
//#define定义宏#define MAX(x,y) ((x)>(y)?(x):(y))//函数的实现int max=(int x,int y){return(x>y?x:y);}int main(){int a=10,b=20;int m=max(a,b);int n=MAX(a,b);printf("较大值:%d\n",m);printf("较大值:%d\n",n);}
预编译:
int main(){int a=10,b=20;int n=(a>b?a:b);printf("较大值:%d\n",n);}
十五、指针
1.内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
%p打印地址
内存单元都有编号,这个编号就是地址,我们把这个地址也叫指针
int main(){int a=10;int* pa=&a;//pa是用来存放地址的所以我们把pa叫指针变量//*告诉我们pa是指针变量,int告诉我们pa指向的对象是int类型的*pa=100;printf("%d\n",a);//100char ch='w';char* pc=&ch;//& 取地址操作符*pc='q';//*解引用操作符,它的意思是通过pc中存放的地址找到pc指向的内容printf("%c\n",ch);//q}
2.指针变量的大小
int main(){int a=10;int* pa=&a;printf("%d\n",sizeof(pa));//4char ch='w';char* pc=&ch;printf("%d\n",sizeof(pc));//4}
32位平台:32根地址线,指针大小4个字节
64位平台:64根地址线,指针大小8个字节
十六、结构体
结构体描述复杂类型。 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。这里只能使用结构体来描述了。//结构体类型typedef struct stu{char name[20];//名字int age; //年龄char sex[5]; //性别char id[15]; //学号}stu;void print(struct stu* ps){//printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id);//->结构体成员访问操作符//结构体指针->结构体成员}int main(){//结构体变量struct stu s1={"张三",18,"男","060701"};//学生一struct stu s2={"如花",45,"女","060702"};//学生二stu s3={0};scanf("%s %d %s %s",s1.name,&(s1.age),s1.sex,s1.id);//输入结构体数据printf("%s %d %s %s\n",s1.name,s1.age,s1.sex,s1.id);//.结构体成员访问操作符//结构体变量->结构体成员print(&s2);//使用函数打印}
初识C语言(1)(2)(3)(4) C语言入门 保姆级教程 变量 常量 字符串 转义字符 操作符 关键字 字符串 指针 函数 结构体 数组 选择语句 循环语句