一、变量是什么?
变量就是对一块内存进行标记的标识符:
(1)英文+数字+下划线(个人倾向使用小写加大写开头单词组合 不使用下划线);(2)不要和系统命名冲突
变量存储在哪里?
变量的标识其实就是存放在可执行文件对应的段内:__text,__data,__bss
变量对应的内容存放在系统当中的内存区域中
(1)bss段的数据为未初始化的全局变量
(2)data段的数据为程序中已初始化的全局变量
(3)stack段的数据为程序临时创建的局部变量
二、运算符
1.运算符是完成变量或表达式进行运算的符号
(1)运算符一般用于多个数值(变量、常量、表达式的值)
(2)表达式是以运算符+操作数+表达式
(3)语句就是以一段话说完,以;结尾的句子
2.左值与右值(关于这个值是否可以进行读写操作)
左值指能够在=左边存在的值,也就代表着这个值是可以进行赋值操作的
右值指能够在=右边的值,也就是这个值可以进行取值操作
3.常量
常量其实就是只能够进行取值操作的简单量 一般常量都是只能作为右值的
诸如数字1 100 2000 1.33 2.55 字符串 都是右值
三、程序结构
1.顺序结构
通过运算符的结合性 代码从上往下执行来保证
2.分支结构
通过分支语句保证条件满足和不满足 来进行控制
包括 (1)if-else if-else if-else (2)switch case break
(参照C++相关经验 不建议使用switch case break,也不要写出嵌套复杂的多层if-else)
3.循环结构
通过循环语句保证条件满足和不满足循环执行
包括 (1)while do-while (2)for foreach(3)goto
(参照C++相关经验 不能使用goto;使用for(;;)代替while(true);使用for(;condition;)代替while(condition))
continue代表的是跳出本次循环,continue以后的语句本次循环不再执行
break跳出最近的循环体 之后的所有循环都不再执行
三大结构都是可以进行嵌套使用的 另外需要注意循环的死循环处理
四、函数
1.函数是C语言实现模块化编程的基础 其具备3个关键:声明、实现、调用
(1)对于一个函数最基本的特征进行说明 一般写在文件最前面或头文件当中
(2)实现 需要完整带有函数主体的内容
{}一般称为域,如果是和特定的运算绑定在一起则被称为XX体,如函数体、循环体、分支体
(3)函数的调用,函数调用就是函数使用的方式
2.函数的特征
函数的返回值类型可以是任何类型 在函数体当中使用return关键字返回函数
return代表函数体的结束,返回匹配函数返回值的值
函数的参数和变量的定义是差不多的
由于函数本质是值传递的过程,有形参和实参的区别:实参指从外部传入值到函数内部的参数,一般是函数调用的时候,填写到参数列表的参数,形参值在内部接收传入的值。
在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。就是无论是实值还是指针传入函数的都是副本。当函数返回指针时,其实返回的是函数内变量指针的副本,由于在主函数结束前,为该函数分配的内存一直存在,则该指针地址会一直存在。如果多次使用不同参数调用该函数,则多个返回的指针值是一致变化的。因此应该在函数外对该返回指针所指向的值进行复制,以实现正确使用。
例如:
#include <stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main(void)
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap1(a,b);
printf("s1:a=%d,b=%d\n",a,b);
a=1,b=2;
swap2(pa,pb);
printf("s2:a=%d,b=%d\n",a,b);
a=1,b=2;
swap3(pa,pb);
printf("s3:a=%d,b=%d\n",a,b);
return 0;
}
void swap1(int x,int y){
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,int *py){
int t;
t=*px;
*px=*py;
*py=t;
}
void swap3(int *px,int *py){
int *pt;
pt=px;
px=py;
py=pt;
}
3.函数声明
函数声明的方式无需函数体 只需要返回值 函数名 函数参数列表
这种声明的格式也被称为函数原型 在接口说明文件当中只需要给到函数的原型声明即可 例如man
五、变量
1.变量的存储位置
(1)变量的作用域 其和编译阶段有关,如果超出作用域就会导致编译错误
基于全文件的作用域,这种全局变量需要用到多文件编译
基于本文件的作用域,这种一般称为静态全局变量,只和这个文件相关 其他文件无法使用
函数内的局部变量 只能够在本函数当中使用,其他函数当中无法使用
基于域的局部变量,只能够在域当中使用,域外部无法使用
变量的作用域范围为:变量的定义或者扩展定义开始,直到域结束为止
扩展作用域一般使用extern关键字在需要的位置进行扩展
如果使用extern对于局部变量进行扩展作用域,会导致链接的过程当中找不到该变量,出现链接错误
产生该问题的原因未extern只会扩充作用域,但是局部变量在对应的局部域当中没有真正定义
(2)变量的生命周期 其和运行阶段有关,如果超出生命周期,就会导致运行错误
变量的存储位置
对于非静态局部变量,一般我们称其定义的位置在栈区,栈区的特点当对应的域结束时,系统会对这块空间进行释放。另外可以手动申请存放到堆区,堆区需要手动进行释放。
对于全局变量,其自带静态特性,可以通过static关键字声明变量存放在静态区。静态区的特点是和整个程序相关的,程序结束,其才会释放。
生命周期的开始为变量的定义时,结束为变量的空间释放时。
static针对于声明周期,使其声明的变量存放到静态区,可以理解为给变量续命。而针对于作用域,其表示限定作用域,比如在某些.c文件当中定义的函数,添加static限定该函数只能适用于当前的.c文件。
六、主要用到的库
(1)输入输出相关
<stdio.h>
(2)字符串或字符空间处理相关的函数
<string.h>
(3)标准库 存放和系统相关的函数
<stdlib.h>
(4)时间相关的函数
<time.h>
(5)和系统相关及操作系统内核相关的函数
<unistd.h>
(6)数学运算相关
<math.h>
七、杂项
(1)abort强制退出程序 exit退出当前进程 如果当前只有一个主进程则相当于是return结束整个程序
(2)rand是生成随机数 srand是设置随机种子
如果设置的随机种子相同 则生成的随机数序列也相同 可用于模拟验证结果
当想要生成随机变化的随机数时 可使用:
srand(time(NULL));
printf("%d\n", rand()% 10000);
atoi为字符串转数字
system为系统功能调用 例如:system(“echo 你好世界”);
各种类型错误
(1)编译期错误一般为C语言语法性的错误;
(2)链接期错误一般为找不到实际调用的错误;
(3)运行期错误有两种:①会导致程序崩溃的错误,一般是由于不符合系统处理的错误导致程序崩溃的错误,②数据类型出错。