C语言概述:
计算机编程语言,应用于底层开发。简易的方式编译,处理地基存储器,产生少量的机器码,不需要任何运行环境支持便能运行的编程语言。良好的跨平台性。是一门面向过程的编程语言。
数据类型
char //字符数据类型 1字节
short //短整型 2字节
int //整型 4字节
long //长整型 4字节
long long //更长的整型 8个字节
float //单精度浮点数 4字节
double //双精度浮点数 8字节
``注:`存在这么多类型为了更加丰富的表达生活中的值。
变量,常量
常量:不可变的值。 变量:变化的值
变量的分类
全局变量局部变量
注:当全局变量和局部变量同名的时候,局部变量优先使用。
变量的作用域和生命周期
作用域:限定的可用性的代码范围。 (1) 局部变量的作用域是变量所在的局部范围。 (2) 全局变量的作用域是整个工程。生命周期: 变量的生命周期是指变量的创建到变量的销毁的一个时间段 (1) 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。 (2) 全局变量的生命周期是:整个程序的生命周期。
变量的定义
定义变量:分两步: 1:开辟空间
int a;//内存空间就开辟好了
2: 写入对应的数据
a=100;
初始化:空间开辟好,里面的数据与生俱来是某个值
int a = 100; //初始化
赋值:第二次进行主动赋值
a = 200; //赋值
常量
1.字面常量
2.const 修饰的常变量
const修饰的变量定义被修饰的变量不能直接修改
3.define 定义的标识符常量
宏定义:见名知义
#define MAX 100
4.枚举常量
enum Sex{
MALE,
FEMALE,
SECRET
};
字符串+转义字符+注释
字符串
由双引号引起来的一串字符称为字符串字面值,或简称字符串。
注: 2. 字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串的内容。 3. 字符串本身默认以’\0’结尾。 4. strlen():字符串的长度不包含反斜杠’\0’。 5. sizeof():字符串的大小包含反斜杠’\0’。 6. "\c"打印就只是c字符,sizeof求大小就是2。
转义字符
注释
代码中不需要的代码可以直接删除,也可以注释掉。代码中有些代码比较难懂,可以加一个注释文字。 注: ctrl+k+c批量化注释 ctrl+k+u批量化取消
选择语句
if…else…switch语句
循环语句
while语句for语句do…while语句
操作符
算数运算符
+ - * %
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作符的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置,后置--
++ 前置,后置++
* 间接访问操作符(解引用操作)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试不相等
== 用于测试相等
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
下标引用,函数调用和结构成员
[] () . ->
常见关键字
关键字typedef
typedef是类型定义,即类型重命名。
关键字static
static是用来修饰变量和函数的
修饰局部变量-静态局部变量: static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期结束。
//代码1
#include <stdio.h>
void test()
{
int i=0;//每次调用函数都初始化
i++;
printf("%d",i);
}
//代码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修饰局部变量的时候有两个作用:
作用域:在代码块有效,使用static有效作用域不改变
生命周期:临时性。static修饰的变量的生命周期是全局属性。
int i=0;//初始化,局部范围作用完释放,再次作用继续执行改代码进行初始化。
static int i=0;//初始化。任何一个变量都只会作用一次。第二次不会再执行此代码直接跳过。
修饰全局变量-静态全局变量: 一个局部变量呗static修饰,使得这个全局变量只能在本源文件内使用,不能再其他源文件内使用。
//代码1 运行正常
//add.c
int g_val=2018;
//test.c
#include<stdio.h>
extern int g_val;
int main(){
printf("%d\n",g_val);
return 0;
}
//代码2 编译错误
//add.c
static int g_val=2018;
//test.c
#include<stdio.h>
int main(){
printf("%d\n",g_val);
return 0;
}
修饰函数-静态函数: 一个函数被static修饰,使得这个函数只能在本源文件内使用,不能再其他源文件内使用。 第一种情况
//代码1
//add.c
int Add(int x,int y)
{
return x+y;
}
//test.c
#include<stdio.h>
extern int add(int x,int y);//可有可无,函数声明默认是extern
int main()
{
printf("%d\n",add(2+3));
}
//代码2
//add.c
static int add(int x,int y)
{
return x+y;
}
//test.c
#include<stdio.h>
int main()
{
printf("%d\n",add(2,3));
}
第二种情况
//代码1
//print.c
#include<stdio.h>//这里加头文件因为printf()函数在stdio.h的库函数中
void show()
{
printf("Hello World!");
}
//test.c
#include<stdio.h>
int main()
{
show();
}
extern声明函数和变量:
声明变量:
extern int a;
在变量定义前加extern关键字表示声明一个变量但不定义它 。它表示"这只是一个声明,它的定义在别的地方",关键字extern,它表示变量是在文件以外定义的,或在文件后面部分才定义.
声明函数:
extern int func1(int length, int width);
这种声明方式和一般的func1()声明方式一样。因为没有函数体,编译器必定把它作为声明而不是函数定义。extern关键字对函数来说是多余的,可选的。C语言的设计者并不要求函数的声明使用extern,这可能有些令人遗憾;如果函数声明也要求使用extern,那么在形式上与变量声明更加一致,从而减少了混乱。
define 定义常量和宏
#define ADD(x,y) x+y
#include<stdio.h>
int main(){
int sum = 0;
sum = 2 * ADD(3, 4);//只做替换,不做计算,替换完结合整个表达式运算
printf("sum=%d", sum);//输出是10不是14
return 0;
}
指针
内存
内存是电脑重要的存储器,计算机中所有的程序的运行都在内存中运行的。 为零有效的使用内存,把内存划分成一个小小的内存单元,每个内存单元的大小是1个字节。 为了能有效访问内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
总结:
sizeof()用来计算数据类型字节大小的程序暂停(无其他意义):
#include<windows.h>
int main(){
System("pause");
}
C函数的默认返回值类型是整型,但是在编译时必须写函数的返回值类型函数只有在被调用的时候才会运行,否则不会运行。内部的所有临时变量都不存在。函数调用的时候如果传参了要发生形参实例化(实参传给形参产生临时变量),函数调用要形成参数的拷贝。数组是相同类型的集合。sizeof()不是函数(sizeof后面的圆括号不是必须的加上只是增加界限可读型,sizoef(int)可以执行,sizeof int无法执行,函数名后面必有括号且不能为某个类型值)变量可以多次声明只能定义一次在一个文件中定义了变量,则在另一个文件中只需声明就可以使用。全局变量一般可以跨文件使用,但是 static修饰全局变量时,改变量只能在本文件中使用,生命周期不变,作用范围发生改变。内存:以一个字节为一个小方格堆积 指针:方便查找,给内存中的每个字节带上编号,提高查找效率。编号在计算机中我们称之为地址,一般的地址具有具有明显的指向性,我们一般把地址叫做指针。 通俗的说:没有指针将遍历查找效率低,而且还不知道查找的值是否是要的值指针和指针变量 其实并未区分 指针就是地址 指针变量是一个变量,变量存放的就是地址在32位平台下,指针大小都是4个字节int a=10; //a代表的是空间 左值 int b=a;//a代表的是内容,b代表的是空间 右值指针解引用:对指针解引用,代表指针所指向的目标 int a=10; int *p=&a; printf("%d",*p);//p解引用,对p 解引用表示p所指向的a