1.什么是c语言

c语言是一门计算机语言,人与计算机交流的语言!
c语言是一门通用计算机编程语言,广泛用于底层开发。C语言的设计目标是提供一种能以简易方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

2.第一个C语言程序

  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("hello world!\n");
  5. return 0;
  6. }

image.png

3.数据类型

数据类型

数据类型 表示
字符型 char
短整型 short int
整形 int
长整型 long int
更长整形 long long int
单精度浮点型 float
双精度浮点型 double

计算每种类型的所占空间的大小(sizeof(数据类型))

单位:字节(bity)

sizeof - 关键字 - 操作符: 计算类型或者变量所占空间的大小

image.png

4.变量

不变的值,c语言用常量来表示,变的值c语言用变量来表示

定义变量的方法

int age = 150;
float weight = 45.5;
char ch = ‘w’;

变量的分类

局部变量

全局变量

例:

  1. #include <stdio.h>
  2. int num2 = 20; //全局变量:定义在代码块{}之外的变量
  3. int main()
  4. {
  5. int num1=0;//局部变量:定义在代码块内
  6. return 0;
  7. }

思考:当全局变量与局部变量定义相同时,是否可以同时出现???

答:可以,且局部变量优先

例:

image.png

变量的使用

案例:两个数相加

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int num1=0;
  5. int num2=0;
  6. int sum=0;
  7. printf("输入相加的两个数字:");
  8. //输入数据,输入函数scanf
  9. scanf("%d%d",&num1,&num2);
  10. sum=num1+num2;
  11. printf("sum=%d\n",sum);
  12. return 0;
  13. }

image.png

C语言语法规定,变量要定义在当前代码块最前面

变量的作用域和生命周期

作用域:通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的
代码范围就是这个名字的作用域。

  • 局部变量的作用域是变量所在的局部范围
  • 全局变量的作用域是整个工程

生命周期:生命周期指的是变量的创建到变量的销毁之间的一个时间段

  • 局部变量的生命周期:进入作用域生命周期开始,出作用域结束。
  • 全局变量的生命周期:这个程序的生命周期

5.常量

c语言的常量分为以下几种:

字面常量

3.14 浮点型常量
10 整型常量
‘a’ 字符常量
“abcde” 字符串常量

const修饰的常变量

image.png

#define定义的标识符常量

image.png

枚举常量

可以一一列举的常量

  1. enum Sex
  2. {
  3. //这种枚举类型的变量未来可能取值
  4. MALE,
  5. FEMALE,
  6. SECRET
  7. };

image.png

image.png

6.字符串

“HelloWorld\n”

这种由双引号引起来的一串字符称之为字符串字面值,简称字符串

字符串就是一串字符

注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算字符串内容

  • 字符串存放在字符数组中
  • 字符数组 - 数组是一组同类型的元素
  • char arr[] = “hello”

例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. //字符串存放在字符数组中
  5. //字符数组 - 数组是一组同类型的元素
  6. //字符串再结尾的位置隐藏了一个\0的字符
  7. //\0是字符串的结束标志
  8. //char arr[] = "hello"
  9. char arr1[] = "abc";
  10. char arr2[]= {'a','b','c'};
  11. printf("%s\n",arr1);
  12. printf("%s\n",arr2);
  13. return 0;
  14. }
  • 字符串在结尾的位置隐藏了一个\0的字符

  • \0是字符串的结束标志

image.png

打印结果
image.png

原因:
arr1中abc后有\0,停止打印
arr2中abc后无\0, 继续打印,无法确定后面还有什么
image.png

验证:

strlen()计算字符串长度

需要引入头文件#include

image.png

7.转义字符

转义字符 释义
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\‘ 用于表示字符常量
\“ 用于表示一个字符长内部的额双引号
\\ 用于一个反斜杠,防止它被解释为一个转义序列符
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd 表示1~3个八进制的数字。如:\130 X
\xdd 表示2个十六进制数字。如:\x30 0

例:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. printf("%d\n",strlen("abcdef")); 6
  6. printf("%d\n",strlen("c:\test\328\test.c")); 14
  7. return 0;
  8. }

8.注释

注释是用来解释复杂的代码
(不支持嵌套注释)

注释分为:
单行注释—————————————->//代码
多行注释—————————————->/代码/

9.选择语句

例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int input = 0;
  5. printf("Are you joking?<1/0>\n");
  6. scanf("%d",&input);
  7. if(input==1)
  8. printf("Yes!I am");
  9. else
  10. printf("No!I am not");
  11. return 0;
  12. }

10.循环语句

例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int talk = 1;
  5. while(talk<100)
  6. {
  7. printf("You are very beautiful!%d\n",talk);
  8. talk++;
  9. }
  10. if(talk==100)
  11. {
  12. printf("No!\n");
  13. }
  14. return 0;
  15. }

11.函数

例:

  1. #include <stdio.h>
  2. int Add(int x,int y)
  3. {
  4. int z=0;
  5. z=x+y;
  6. return z;
  7. }
  8. int main()
  9. {
  10. int a = 0;
  11. int b = 0;
  12. int sum =0;
  13. printf("Plese enter two numbers:\n");
  14. scanf("%d%d",&a,&b);
  15. sum=Add(a,b);
  16. printf("The sum =%d",sum);
  17. return 0;
  18. }

函数特点就是简化代码,代码复用

12.数组

数组:一组相同类型元素的集合

数组是用下标来访问的。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[10]={1,2,3,4,5,6,7,8,9,10};
  5. int i=0;
  6. while(i<10)
  7. {
  8. printf("%d",arr[i]);
  9. i++;
  10. }
  11. return 0;
  12. }

int arr[10] = {1,2,3,4,5,6,7,8,9,10}; char ch[5]={‘a’,’b’,’c’};//不完全初始化,剩余的默认为0

13.操作符

算术操作符

      • / %(取模,余数)

当“/”相除的两个数都为整数时,结果为整数(不四舍五入,全舍),若其中一个为小数,结果为小数

移位操作符

移动的是二进制位

  1. <<

位操作符

&(与) ^(或) |(非)

赋值操作符

= += -= *= /= &= ^= |= >>= <<=

单目操作符

! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作符的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
前置、后置—
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换

关系操作符


>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”

逻辑操作符

&& 逻辑与
|| 逻辑或

条件操作符

exp1 ? exp2 : exp3

exp1 成立, exp2计算,整个表达式的结果是:exp2的结果
exp2 不成立,exp3计算,整个表达式的结果是:ecp3的结果

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a=3;
  5. int b=5;
  6. int max =0;
  7. if(a>b)
  8. max =a;
  9. else
  10. max =b;
  11. //等价于
  12. max= a > b? a : b;
  13. printf("%d\n",max);
  14. }

逗号表达式

exp1, exp2, exp3, …expN

(逗号隔开的一串表达式)

逗号表达式,是从左向右依次计算的
整个表达式的结果是最后一个表达式的结果

下标引用、函数调用和结构成员

[ ] ( ) . ->

14.常见关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

  • c语言提供,不能自己创建关键字
  • 关键字不能是变量名
  1. auto是自动的 每个局部变量都是auto修饰的
  2. extern是用来声明外部符号的
  3. register寄存器关键字

image.png

  1. typedef类型重定义,类型重命名
  2. static静态,用来修饰变量和函数的
  • static修饰局部变量,改变了变量的生命周期(本质上是改变了变量的存储类型)
  • static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c)内部可以使用,其他源文件不能使用;全局变量,在其他原文件内部可以使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就 不能链接到这个静态全局变量了。
  • static修饰函数,使得函数只能在自己所在的源文件内部属性,不能在其他源文件内部使用;本质上:static是将函数的外部链接属性变成了内部链接属性(和static修饰全局变量一样)

image.png

15.定义常量和宏

dedfine是一个预处理指令

  1. define定义符号

    1. #include <stdio.h>
    2. #define MAX 100
    3. int main()
    4. {
    5. printf("%d\n",MAX);
    6. return 0;
    7. }
  2. define 定义宏

    1. #include <stdio.h>
    2. #define ADD(x,y) x+y
    3. int main()
    4. {
    5. printf("%d\n",4*ADD(2,3));
    6. return 0;
    7. }
    8. //11,define只是单纯的替换

16.指针

内存

内存是电脑上特别重要的存储器,计算机所有的程序的运行都是在内存中进行的。
所以为了有效的使用内存,就把内存划分成一个小小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行的编号,这些编号被称之为该内存单元的地址。

指针就是地址

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 10; //a在内存中要分配空间的 - 4个字节
  5. printf("%p\n",&a);//%p专门用来打印地址的
  6. int * pa= &a;//pa是用来存放地址的,在c语言中pa叫指针变量
  7. //*说明pa是指针变量
  8. //int 说明pa执行的对象是int类型的
  9. char ch = 'w';
  10. char * pc = &ch;
  11. int x = 10;
  12. int * px =&a;
  13. *px = 20;// *解引用操作 *怕就是通过px里面的地址,找到x
  14. printf("%d\n",x);
  15. //变了,x变成了20
  16. return 0;
  17. }

指针的大小是相同的
指针是用来存放地址的
指针需要多大空间,取决于地址的存储空间的需要多大的空间

17.结构体

结构体使得c语言有能力描述复杂类型

  1. #include <stdio.h>
  2. struct Stu
  3. {
  4. char name[20];
  5. int age;
  6. double score;
  7. };
  8. int main()
  9. {
  10. struct Stu s = {"张三",20,85.5};
  11. printf("%s %d %lf\n",s.name,s.age,s.score);
  12. struct Stu * ps= &s;
  13. printf("%s %d %lf\n", (*ps).name,(*ps).age,(*ps).score);
  14. printf("%s %d %lf\n", ps->name,ps->age,ps->score);
  15. return 0;
  16. }