前言:初识C语言只是粗略的把C的基础知识蜻蜓点水般的过一遍,后期我会分享出详细的各个知识点详解。
初识C语言
什么是C语言?
- C语言是一门高级编程语言,是人与计算机交流的工具。而C语言最擅长与计算机底层打交道,如擅长开发操作系统,驱动软件及硬件。
- C语言是面向过程的语言,广泛用于工业上,因此也是一门工业语言。
- C语言乃编程之本,正所谓C生万物。
- char //字符数据类型
- short //短整型
- int // 整形
- lomg //长整形
- long long更长整形
- float .//单精度浮点数
- double //双精度浮点数
//以上C语言的内置类型
//C语言内置类型在计算机所占大小
变量的作用域和生命周期 作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字/变量名称并不是有效/可用。
而限定这个名字的可用性的代码范围就是这个名字/变量名称的作用域。
- 局部变量的作用域就是所在局部的范围。
- 全局变量的作用域就是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束(出了大括号就无了)。
- 全局变量的生命周期是:整个程序的生命周期。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束(出了大括号就无了)。
- 局部变量的作用域就是所在局部的范围。
?在一个工程中,主函数有且只有一个。
? C语言跨文件调用变量方法使用 extern
?
字符串+转义字符+注释 字符串
"hello bit\n"
这种由双引号引起来的一串字符串称为字符串字符面值,或者简称字符串。
注:字符串的结束标志是\0的转义字符,在计算字符串长度的时候\0是结束标志,不算字符串内容。
接下来通过代码演示
int main(){ char arr [] = { 'a','b','c'}; printf("%s\n", arr); char arr2[] = { 'a','b','c','\0'}; printf("%s", arr2); return 0; }

文章图片
由于char arr [] 后面没有加\0所以输出结果为abc后再跟一些随机值,\0的位置是不定的是。\0之前abc之后可以是任意的数字,符号,汉字。而char arr2[] 中加了\0所以只输出abc不会像上面一样输出一些奇奇怪怪的值。转义字符
故名思义就是改变其原来的意思,变成另一个意思。假如我们要打印一个目录:c:\code\test.c\n,可能我们会天真以为它会原样输出,可是…

文章图片
转义字符表

文章图片
注释
1. 代码中不需要的代码 可以直接删,亦可以注释
2. 代码中有些难懂地方,可以加注释,既方便自己看,也方便别人看自己的代码。
注释风格
- C语言的注释风格/…/AA
缺点:不能嵌套注释
- C+++风格//xxxxxx
可以注释一行也可以多行
- C+++风格//xxxxxx
? 如果你不打码,那么毕业即失业,就只能搬砖去了。
? 这就是选择!
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if (coding == 1)
{
prinf("坚持,走上人生巅峰r\n");
}
else
{
printf("放弃,工地搬砖!\n");
}
return 0;
}
循环语句 有些事必须一直做,比如日复一日的学习,打代码。比如四季轮回。
循环语句有三类
- while语句
- do…while语句
- for语句
int main()
{
int n;
int sum=0;
int i = 1;
scanf("%d", &n);
while (i <= n)
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
循环次数最少0次
do …while
int main()
{
int n;
int sum=0;
int i = 1;
scanf("%d", &n);
do{
sum += i;
i++;
} while (i <= n);
printf("%d\n", sum);
return 0;
}
先循环,再判断,循环次数最少1次
for
int main()
{
int sum=0;
int n;
scanf("%d", &n);
for (int i = 1;
i <= n;
i++) {
sum += i;
}
printf("%d\n", sum);
return 0;
}
函数
- 库函数:C语言自己提供的
- 自定义函数自己写的
int Add(int x, int y)
{
return x+y;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
函数的特点就是:简化代码,提高代码复用性
数组 数组:一组相同类型元素的集合
C语言规定:数组的每个元素都有下标,下标是从0开始的。
数组可以通过下标来访问。
int arr[10] = { 0 };
//定义一个数组里面有10个元素,下标范围是0~9。
数组的使用
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0;
i <= 9;
i++) {
printf("%d\n", arr[i]);
}
return 0;
}
操作符
算术操作符
+ - * / %
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^=|=>>=<<=
单目操作符
!逻辑反操作
-负值
+正值
&取地址
sizeof操作数的类型长度(以字节为单位)
~对一个数的二进制按位取反
--前置、后置--
++前置、后置++
*间接访问操作符(解引用操作符)
(类型)强制类型转换
int main() {
//C语言中,0表示假,非0表示真
int flag = 5;
if (!flag) {
printf("hehehehe\n");
}
return 0;
}
int main() {
int a = -10;
int b = +a;
printf("%d\n", b);
return 0;
}++与--
int main() {
int a = 10;
/*int b = a + 1;
*/
int b = a++;
//前置++,先++,后使用//a=a+1;
b=a;
int b = ++a;
//后置+=,先使用,后++//int b=a;
a=a+1;
int b = --a;
*///a=a-1;
b=a;
int b = a--;
//b=a;
a=a-1;
printf("a=%d b=%d\n", a, b);
return 0;
}
关系操作符
>
>=
<
<=
!=用于测试“不相等”
==用于测试“相等”
逻辑操作符
&&逻辑与
||逻辑或
条件操作符
exp1 ? exp2 : exp3
下标引用,函数调用和结构成员
[] () . ->
int main() {
int arr[10] = { 0 };
arr[5] = 9;
//[]下标引用操作符,它的操作数:数组名,下标。 return 0;
}int get_max(int x,int y) {
return x > y ? x : y;
}
int main() {
int m = get_max(3, 5);
//函数的调用操作符,它的操作数是:函数名,3,5
printf("%d", m);
return 0;
}
常见关键字
autobreakcasecharconstcontinuedefaultdodouble elseenum
extern floatforgotoifintlongregisterreturnshortsigned
sizeofstatic structswitchtypedef unionunsignedvoidvolatilewhile
关键字typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
printf("%d\n", num1);
printf("%d", num2);
return 0;
static关键字
在C语言中: static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
//代码1
void text() {
int k = 0;
k++;
printf("%d\n", k);
}
int main() {
for (int i = 0;
i < 10;
i++) {
text();
}
return 0;
}

文章图片
void text() {
static int k = 0;
k++;
printf("%d\n", k);
}
int main() {
for (int i = 0;
i < 10;
i++) {
text();
}
return 0;
}

文章图片
结论:
static修饰局部变量改变了变量的生命周期解释:
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
// static修饰的局部变量时候,局部变量就变成了静态的局部变量修饰全局变量-称为静态全局变量 或者修饰函数-称为静态函数
// 出了局部范围,不会销毁,下一次进入函数依然存在
// 其实是因为:static修饰的局部变量是存储在静态区的
// static修饰局部变量是,实际改变的是变量的存储位置,本来一个局部变量是放在栈区的,被static
// 修饰后放在静态区,从而导致,出了作用域依然存在,生命周期并没有结束
一个全局变量和函数是具有外部链接属性的,但是被static修饰后外部属性就变成了内部链接属性,只能在自己所在的源文件内部使用了。给人感觉上是作用域变小了
sizeof
int main() {
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
//计算变量或其类型所占空间的大小
return 0;
}
register
int main() {
int a = 20;
register int a = 10;
//建议将10放到寄存器上
return 0;
}
#define定义常量和宏 定义常量
#define MAX 1000
int main() {
int m = MAX;
printf("%d", m);
return 0;
}
定义宏
#define MAX(x,y)(x>y?x:y)
int main() {
int a = 90;
int b = 98;
int m = MAX(a, b);
printf("%d", m);
return 0;
}
指针 引文:电脑有32位操作系统/操作系统64,而32位和64位代表着什么呢?待我慢慢道来。就举32位操作系统为例,32位代表电脑有32根地址线/数据线。地址线接上电线在通电的话便可以产生电信号,电信号又会转换成数字信号1/0。电脑帮我们储存的数据,图片,音乐等等。都是储存在内存当中,而每个内存都有自己的地址,也有自己的大小,一个内存单元的大小就是一个字节。32位能产生2的32次方个地址,,就是00000000000000000000000000000000到11111111111111111111111111111111,也就意味着32位的电脑的内存是4G。我们所学的指针也不过就是地址,没有我们想的那么高不可攀。
二话不说上代码
int main() {
char a = 'w';
//%p打印地址
printf("%p\n", &a);
return 0;
} //内存单元都有编号,编号就是地址,我们把地址称为
int main() {
int a = 10;
int* pa = &a;
//pa是用来存放地址的,所以我们把pa叫做指针变量
*pa = 1000;
//*解引用操作符,它的意思就是通过pa中存放的地址,找到pa指向的内容。
printf("%d", a);
return 0;
}
指针大小
//指针大小
int main() {
int a = 10;
int* pa = &a;
printf("%d",sizeof(pa));
return 0;
}
结论:指针大小在32位平台是4个字节,64位的平台是8个字节。
结构体
//结构体
struct stu {
char name[20];
int age;
char sex[3];
char id[20];
};
void print(struct stu* ps, struct stu* pd) {
/*printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).id);
*/
//->结构成员访问操作符
//J结构指针->结构体成员
printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id );
printf("%s %d %s %s\n", (*pd).name, (*pd).age, (*pd).sex, (*ps).id);
}
int main() {
//结构体变量
struct stu s1 = {"叶秋涵",19,"女","202104040207"};
struct stu s2 = { "叶子秋",19,"男","202104040208" };
//.结构成员访问操作符
//结构体变量.结构体成员
//输出结构体数据
scanf("%s %d %s %s\n",s1.name,&(s1.age),s1.sex,s1.id);
/*printf("%s %d %s %s\n", s1.name, s1.age, s1.sex, s1.id);
printf("%s %d %s %s", s2.name, s2.age, s2.sex, s2.id);
*/
print(&s1, &s2);
return 0;
【C语言|初识C语言】今天的博客分享到此结束,希望对你的学习有所帮助!
推荐阅读
- loongarch|龙芯(LoongArch)架构获取CPUID
- 程序员|Python爬虫系列(爬取小说并写入txt文件)
- python|python中使用xlrd、xlwt操作excel表格详解
- python|100天精通Python——第41天(自动化操作Excel(xlrd和xlwt))
- 数据结构|二叉树链式结构的实现及应用
- 数据结构与算法|详解线索二叉树
- 作业|Linux5.19
- <C语言;售货员问题
- 零基础JavaScript学习|零基础JavaScript学习【完结篇】