目录
什么是C语言?
常见的一种计算机语言。多用于底层开发,驱动层。
1、第一个C程序
2、数据类型
char //字符数据类型 1
short //短整型 2
int //整形 4
long //长整型 4
long long //更长的整形 8
float //单精度浮点数 4
double //双精度浮点数 8
1byte=8bit
3、变量、常量
3.1、变量的创建方法
//变量在创建时不初始化是不好的代码习惯
3.2、变量的分类
局部变量:定义在代码块内部的变量
全局变量:定义在代码块外部的变量
优先使用局部变量
3.3、变量的使用
3.4、变量的生命周期和作用域
作用域
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程
生命周期
局部变量:进入局部变量所在的范围,生命周期开始,出局部变量所在的范围的时候,生命周期结束
全局变量:整个程序的生命周期
3.5、常量
1、字面常量
100
3.14
"abc"
'w'
2、const修饰的常变量
const int a
3、#define定义的标识符常量
#define MAX 100
//习惯的大写
4、枚举类型
enum Sex
{
MALE,
SECRTE
}
4、字符串+转义字符
4.1、字符串
char ch[]="abc";
//strlen只计算\0之前的字符个数
4.2、转义字符
转变原来的意思
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词
|
\' |
用于表示字符常量
|
\“ |
用于表示一个字符串内部的双引号
|
// |
用于表示一个反斜杠,防止它被解释为一个转义序列符。
|
\a |
警告字符,蜂鸣
|
\b |
退格符
|
\f |
进纸符
|
\n |
换行
|
\r |
回车
|
\t |
水平制表符
|
\v |
垂直制表符
|
5、注释
解释代码或暂时删除代码
C++://
C:/**/
6、选择语句
if
if…else
7、循环语句
while
for
do……while
8、函数
#include<include.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
上述代码,写成函数如下:
#include<include.h>
int Add(int x, int y)
{
int z = x+y;
return z;
}
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;
}
9、数组
9.1、数组的定义
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
9.2、数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
9.3、数组的使用
#include<stdio.h>
int 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;
}
10、操作符
1、算术操作符
+ - * /(两边有一个小数结果为小数) %(取模运算符,只能作用于整数)
2、移位操作符:作用于一个数的二进制位
左移:<< 右移:>>
3、位操作符
& 按位与 对应的二进制位有0,则为0,全1才为1
| 按位或 对应的二进制位有1,则为1,全0才为0
^ 按位异或 对应的二进制位相同为0,相异为1
4、赋值操作符
= += -= *= /= &= ^= |= >>=
5、单目操作符
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 计算变量或者类型所创建变量站局内存的大小,以字节为单位 |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
6、关系操作符
> >= < <= != ==
7、逻辑运算符
&& 逻辑与 || 逻辑或
8、条件操作符
exp1?exp2:exp3
9、逗号表达式
exp1,exp2……expN
10、下标引用操作符
[ ]
11、函数调用操作符
( )
12、结构成员操作符
. ->
11、常见关键字
11.1关键字typedef
给类型重命名
//将unsigned int 重命名为u_int, 所以u_int也是一个类型名
typedef unsigned int u_int;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
u_int num2 = 0;
return 0;
}
11.2关键字static
11.2.1修饰局部变量
/代码1
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
//代码2
#include <stdio.h>
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修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束
11.2.2修饰全局变量
//代码1 //add.c
int g_val = 2021;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//编译成功
//代码2
//add.c
static int g_val = 2021;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//编译错误
结论:
一个全局变量能被整个工程使用,是因为全局变量具有外部链接属性,当被static修饰后,外部链接属性变成内部链接属性,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
11.2.3修饰函数
//代码1
//add.c
int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
结论:
一个函数能被整个工程使用,是因为函数具有外部链接属性,当被static修饰后,外部链接属性变成内部链接属性,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
12、#define定义的常量和宏
//define定义标识符常量
#define MAX 10000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
13、指针
13.1内存
有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
取出变量地址如下:
#include <stdio.h>
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
地址存储,需要定义指针变量:
int num = 10;
int *p;//p为一个整形指针变量
p = #
指针的使用:
#include <stdio.h>
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
}
13.2指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//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;
}
14.结构体
用来描述一个复杂对象,比如一本书:书名+作者+定价+书号
struct Book
{
char bookname[20];//书名
char name[20]; //作者
int price; //定价
char bookid[15]; //书号
};
结构体初始化:
//打印结构体信息
struct Book b = {"语文", "张三", 20, "20180101"};
//.为结构成员访问操作符
printf("bookname = %s name = %s price = %d bookid = %s\n", b.bookname, b.name, b.price, b.bookid);
//->操作符
struct Book *pb = &b;
printf("bookname = %s name = %s price = %d bookid = %s\n", pb->bookname, pb->name, pb->price, pb- >bookid);