编程是一门实践性的学科,绝对不是理论。如果不动手“敲”代码的话,永远都学不会编程。很多问题只有在“敲代码”的时候才能发现,才会有更加深刻的体会、领悟和理解。而不是靠死记硬背书中的注意点,那样真的很痛苦。我在学习编程的时候从来都不会刻意记忆什么注意点,这些知识点都是在不停“敲代码”的过程中,自然而然地融入我的身体中的。
#include//主函数是程序的入口
//主函数有且仅有一个
//在一个工程中有且只有一个主函数
int main()
{printf("Hello world\n");return 0;
}
char 字符数据类型 1(字节)
short 短整形 2(字节)
int 整形 4(字节)
long 长整形 4(字节)
long long 更长的整形 8(字节)
float 单精度浮点数 4(字节)
double 双精度浮点数 8(字节)
如何求解上述数据类型所占多大空间?
#includeint main()
{printf("%d\n", sizeof(char));printf("%d\n", sizeof(short));printf("%d\n", sizeof(int));printf("%d\n", sizeof(long));printf("%d\n", sizeof(long long));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));return 0;
}
程序结果如下:
在C语言中,不变的量用常量来表示,变的量用变量来表示。
全局变量:定义在大括号的外部
局部变量:定义在大括号的内部
#includeint a = 1000;//全局变量-定义在大括号的外部
int main()
{int a = 100;//局部变量-定义在大括号的内部//局部变量的名字和全局变量的名字冲突的情况下,局部优先printf("a=%d\n", a);return 0;
}
#includeint main()
{int num1 = 0;int num2 = 0;int sum = 0;//存放变量相加的结果//输入scanf("%d %d", &num1, &num2);//相加sum=num1 + num2;//输出printf("%d\n", sum);return 0;
}
变量的作用域和生命周期
作用域:一段程序中所用到的名字并不是总是有效、可见的。而限定这个名字的可用性的代码范围就是这个名字的作用域。
变量的作用域 1. 局部变量的作用域是变量所在的局部范围。 2. 全局变量的作用域是整个工程。生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
变量的生命周期: 1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。 2. 全局变量的生命周期是:整个程序的生命周期。1、字面常量
20;
3.14;
'a';//字符常量
"abcde";//字符串常量int a = 10;
char ch = 'w';2、 const修饰常变量
const是一个C语言的关键字
const是常属性的意识
const int num = 10;3、#define定义的标识符常量
int a = M;
int arr[M] = { 0 };4、枚举常量
enum Color
{
RED,//0
GREEN,//1
BLUE//2
};
#include
#includeint main()
{char arr1[] = { "abc" };char arr2[] = { 'a','b','c' };//没有'\0'则会出现乱码printf("%s\n", arr1);printf("%s\n", arr2);//strlen-库函数//求字符串长度//计算的是'\0'之前出现的字符的个数printf("%d\n", strlen(arr1));return 0;
}
程序结果如下:
转义字符:
转义字符 释义
\? 在书写连续多个问号时使用,防止他们被解析成三字母词 \' 用于表示字符常量' \“ 用于表示一个字符串内部的双引号 \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。 \a 警告字符,蜂鸣 \b 退格符 \f 进纸符 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \ddd ddd表示1~3个八进制的数字。 如: \130 X \xdd dd表示2个十六进制数字。 如: \x30 0
注释
1. 代码中有不需要的代码可以直接删除,也可以注释掉 2. 代码中有些代码比较难懂,可以加一下注释文字 注释有两种风格: C语言风格的注释 /*xxxxxx*/ 缺陷:不能嵌套注释 C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行#include int main()
{int coding = 0;printf("你会去敲代码吗?(选择1 or 0):>");scanf("%d", &coding);if (coding == 1)printf("坚持,你会有好offer\n");elseprintf("放弃,回家卖红薯\n");return 0;
}
//while循环的实例
#include int main()
{printf("加入比特\n");int line = 0;while(line<=20000){line++;printf("我要继续努力敲代码\n");}if(line>20000)printf("好offer\n");return 0;
}
#includeint 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);return 0;
}
#includeint main()
{//数组-能够存放一组相同类型的元素int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i < 10; i++)printf("%d ", arr[i]);printf("\n");return 0;//C99中引入加长数组
}
算术操作符 + - * / %
移位操作符 >> <<
位操作符 & ^ |
赋值操作符 = += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
关系操作符
> >= < <= != 用于测试“不相等” == 用于测试“相等”
逻辑操作符
&& 逻辑与 || 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1, exp2, exp3……expN
下标引用、函数调用和结构成员
[] () . ->
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{//观察num1和num2,这两个变量的类型是一样的unsigned int num1 = 0;uint_32 num2 = 0;return 0;
}
static
在C语言中: static是用来修饰变量和函数的 1. 修饰局部变量-称为静态局部变量 2. 修饰全局变量-称为静态全局变量 3. 修饰函数-称为静态函数
修饰局部变量 #include
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 10; i++){test();}return 0;
}
static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
修饰全局变量
#include
void test()
{//static修饰局部变量static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 10; i++){test();}return 0;
}
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。 (一个全局变量是具有外部链接属性的,但是被static修饰后外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用(通过使用extern来解决))
结论:
static修饰局部变量的时候,局部变量就变成了静态局部变量除了局部的范围,不会销毁,下一次进入函数依然存在其实是因为:static修饰的局部变量时存储在静态区的。
static修饰局部变量时,实际改变的是变量存储位置,本来一个局部变量是放在栈区的,被static修饰后放在静态区。从而导致,出了作用域依然存在,生命周期并没有结束。
修饰函数
#includeint Add(int x, int y)
{return c + y;
}
//Test.c
int main()
{printf("%d\n", Add(2, 3));return 0;
}static int Add(int x, int y)
{return c + y;
}
//test.c
int main()
{printf("%d\n", Add(2, 3));return 0;
}
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。 (一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成了内部链接属性,这时这个函数只能在自己所在的源文件中内部使用,其他文件是无法使用的)。#include //define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))int main()
{int sum = ADD(2, 3);printf("sum = %d\n", sum);sum = 10*ADD(2, 3);printf("sum = %d\n", sum);return 0;
}
#include//内存单元都有编号,这个编号就是地址,我们把这个地址也叫指针
int main()
{int a = 10;int* pa = &a;//pa是用来存放地址的,所以我们把pa叫做指针变量*pa = 100;printf("%d", a);char ch = 'w';char* pc = &ch;//&取地址操作符*pc='q';//解引用操作符,它的意思就是通过pc中存放的地址,找到pc指向的内容。printf("%c", ch);return 0;
}
#include
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)int main()
{printf("%d\n", sizeof(char *));printf("%d\n", sizeof(short *));printf("%d\n", sizeof(int *));printf("%d\n", sizeof(double *));return 0;
}
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
#include//结构体
typedef struct Stu
{char name[20];int age;char sex[5];char id[20];
}Stu;void Print(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()
{//结构体变量Stu s1 = { "张三",18,"男","2021060701" };Stu s2 = { "如花",45,"女","2021060702" };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);//.结构成员访问操作符//结构体变量.结构体成员return 0;
}