C程序的源代码有下面的特点:
(1)程序一般用小写字母书写
(2)大多数语句结尾必须有分号作为终止符,表示一个语句结束。同一个语句需要写在同一行上
(3)每个程序必须有一个主函数,主函数用main()声明,并且只能有一个主函数。在Linux系统中,main()主函数应该是int类型。
(4)每个程序中的自定义函数和主函数需要用一对大括号括起来。
(5)程序需要使用“#iinclude<>"语句来包含系统文件,这些文件中定义了系统函数的接口或者函数实现(一般是函数声明)。
(6)注释写在/**/符号之间,不是程序的必需部分,但是可以增强程序的可读性。
逻辑错误:指的是程序的设计思路发生了错误
语法错误:指书写语句时,发生了错误的语句
异常指的是代码中轻微的错误,这些错误一般不会影响程序的正常运行,是不完全符合编程的规范。(告警)
错误指的是程序的语法出现问题,程序编译不能正常完成,产生一个错误信息。
词法分析指的是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个单词符号
语法分析是指以单词符号作为输入,分析单词符号串是否形成符合语法规则的语句
将编写出的程序代码转换成计算机可以运行的程序的软件叫做编译器
1、整型(int)%d %ld
类型 | |
signed short int | 有符号短整型数。简写为short或int,字长为2字节,数的范围是-32768~32767 |
signed long int | 有符号长整型数。简写为long,字长为4字节,数的范围是-2147483648~2147483647 |
unsigned short int | 无符号短整型数,简写为unsigned int,字长为2字节,数的范围是0~65535 |
unsigned long int | 无符号长整型数。简写为unsigned long,字长为4字节,数的范围是0~4294967295 |
整型变量的3种表示方法:
注:可在整型常数后添加一个“L”或“l”字母表示该数为长整型数,如:j=123L
2、浮点型(float)%f
小数、科学计数法的值都是用浮点型变量来存储的。
(1)float单精度浮点数,字长为4个字节共32位二进制数,可表示数的范围是3.4*10-38E~3.4*10+38E(E代表指数)
指数曲线:
(2)double双精度浮点数,字长为8个字节共64位二进制数,可表示数的范围是1.7*10-308E~1.7*10+308E
float m;
double n;
m=1.234;
n=.1234;/*绝对值小于1的浮点数,其小数点前面的零可以忽略*/
/*浮点数常数只有十进制一种进制形式,默认格式保留六位小数,没有小数后面补零*/
3、字符型(char)%c
字符型变量在计算机中以ASCII码方式表示,长度为一个字节。各种字母、符号都可以是一个字符型变量。
字符 | 名称 | ASCII码 |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) | 008 |
\f | 换页(FF) | 012 |
\n | 换行(LF) | 010 |
\r | 回车(CR) | 013 |
\t | 水平制表(HT) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 反斜杠 | 092 |
\? | 问号字符 | 063 |
\' | 单引号字符 | 039 |
\" | 双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
字符型变量需要用char关键字来定义。
4、变量名
变量名只能由字母、数字、下划线组成,且开头只能是字母或下划线。
5、字符NULL
如果要对变量赋值为空值,则可将这个变量赋值为NULL,表示空字符,或者没有这个数值。
int a=NULL;
char b=NULL;
float c=NULL;
6、格式字符串
%c:输出单个字符,参数为该字符的ASCII码
%d:以十进制形式输出带符号整数(正数不输出符号)
%e或%E:以指数形式输出单、双精度实数,默认保留6位小数
%f:以小数形式输出单或双精度实数,默认保留6位小数
%g或%G:以%f或%e中较短的输出宽度输出单、双精度实数。如果指数小于-4或者大于等于默认精度,则使用%e或%E格式输出;否则使用%f格式输出,省略末尾多余的0.
%i:以十进制形式输出带符号整数,同%d.
%o:以八进制形式输出无符号整数(不输出前缀0)
%s:输出字符串,参数为char指针,显示字符串中所有的字符。
%u:以十进制形式输出无符号整数
%x或%X:以十六进制形式输出无符号整数,%x表示输出小写形式,%X表示输出大写形式
7、scanf函数从键盘读入
scanf("<格式化字符串>",<地址表>)
if语句流程控制
if(条件表达式){
语句块;
}else{
语句块;
}
switch流程控制语句
switch(条件){
case 结果1:
执行内容1;break;
case 结果2:
执行内容2;break;
。。。
}
for循环语句
for(起始条件;循环条件;循环变量变化){
循环体执行的内容;
}
while循环语句
while(循环条件){
循环体语句;
循环条件改变;
}
do while循环语句
do
{
循环体;
} while(循环条件);
转移控制语句:
break:循环中止
continue:进入下一次循环
return:中断程序的执行
三元操作符
条件表达式1?结果表达式1:结果表达式2
例如:int age[10],访问方式age[3];定义一个不定个数的变量的字符数组char a[];
(1)在定义数组时,已经定义了数组的数据类型,在访问时需要按照数组的数据类型进行访问和赋值
(2)数组的下标是从0开始的
(3)定义数组a[n]后,有n个元素,但是没有a[n]这个元素。
溢出指的是程序中的变量存储空间不够,或者访问了不存在的变量,从而使程序发生错误。
程序中的变量都是以字节的形式存储在内存单元中的,这些内存单元都有一个编号,这个编号就是程序中的指针。
一个变量是用“&”取地址的,一个指针变量可以用“*”来取这个变量指向的数值
- int *p;/*定义一个指针变量*/
- int i=5,j;/*定义一个整型变量*/
- p=&i;/*变量i的地址赋值给p*/
- j=*p;/*指针p的值赋值给j*/
数组指针
- #include
- void main()
- {
- int *p;
- int a[3];
- a[0]=10;
- a[1]=11;
- a[2]=12;
- p=a;
- printf("%d\n",*p);/**p是取数组指针的值*/
- p++;/*指针向后移动一个单元*/
- printf("%d\n",*p);/*输出指针指向的内容*/
- p++;/*指针向后移动一个单元*/
- printf("%d\n",*p);/*输出指针指向的内容*/
- p++;/*指针向后移动一个单元*/
- printf("%d\n",*p);/*输出指针指向的内容*/
-
- }
- /*输出结果为10,11,12*/
指针可以做加法和减法算数运算,相当于指针的位置向后或向前移动若干个存储单元。这里移动的存储单元指的是可以存储相应变量的内存空间大小,即可能一个单元占用多个字节空间。
2、字符数组与字符串
字符数组是一种特殊的数组。定义一个字符数组以后,这个字符数组会返回一个头指针。可以根据这个头指针来访问数组中的每个字符。
3、二维数组与指针
行和列 | 0 | 1 | 2 | 3 | 4 |
0 | p | p+1 | p+2 | p+3 | p+4 |
1 | p+5+0 | p+5+1 | p+5+2 | p+5+3 | p+5+4 |
2 | p+5+5+0 | p+5+5+1 | p+5+5+2 | p+5+5+3 | p+5+5+4 |
3 | p+5+5+5+0 | p+5+5+5+0 | p+5+5+5+0 | p+5+5+5+0 | p+5+5+5+0 |
数组中变量的指针地址与首指针存在着下面的关系:
q=p+(行数*总列数)+列数
4、常见问题
在使用指针时,需要牢记:不可以随意向不确定的内存单元写入数据。这种写操作可能破环内存中其他的数据,引起其他程序错误。正确的方法是,一个指针先取得正确的内存地址,然后访问一个确定内存单元。
(1)错误操作:错误地将一个数值直接赋值给一个指针变量。
正确操作:对一个变量取地址,然后把一个数值赋值给这个指针所指向的变量。
(2)错误操作:数组指针的越界错误:移动指针时,不注意移动的次数和位置
正确操作:考虑移动的次数和数组的范围
类型名 函数名(参数列表)
{
函数体;
}
函数名:函数一般会返回一个数据,这个数据就是函数返回值。返回值的数据类型就是函数的数据类型。函数的类型可以是所有的数据类型,没有返回值时,则声明函数的类型为void
函数名:函数的名称。函数的命名规则和变量一样。
参数列表:函数输入的参数,函数需要使用这些参数进行运算
函数体:完成函数运算功能的程序。
递归函数:函数在内部调用自己
- #include
- int addn(x){
- if(x==1){
- s=1;
- }else{
- s=x+addn(x-1);
- }
- return (s);
- }
2、main函数的参数argc与argv
argc是一个整型变量,表示参数的个数。*argv[]时一个指针型数组,数组中的每个指针指向一个参数的字符数组
- #include
- int main(int argc,char *argv[]){
- int i;
- for(i=0;i
- printf("%s\n",argv[i]);/*输出argv数组所指向的字符串*/
- }
- }
3、函数与指针
变量、函数的参数与返回值都可以是指针类型的
值调用:进行函数调用时,给形式参数分配内存空间,并把实际参数的值直接传递给形式参数。这一过程是参数值的直接传递过程。
引用调用:当用指针或数组作为函数的参数时,可以用指针来访问实际参数的值。形式参数的变化将直接引起实际参数的变化。
注:调用语句中的参数是实际参数,被调用函数中的参数是形式参数。
4、库函数
库函数按照不同的功能封装在多个头文件中,库函数的常用功能与种类:
字符类型分类函数:对字符按照字母、数字、控制字符、分隔符、大小写字母等进行分类和测试。
转换函数:用于字符或字符串的转换。例如,把int类型转成char类型,大小写转换等
目录路径函数:用于文件和目录的增删改查。
诊断函数:实现系统管理和系统诊断的功能。
图形函数:绘制图形和屏幕管理的功能
输入输出函数:实现用户与设备的交互与管理。
接口函数:用于系统、BIOS和硬件的接口,完成设备的控制与管理
字符串函数:用于字符串操作和处理,完成字符串的复制、转换、合并等功能。
内存管理函数:申请或释放内存
数学函数:用于数学运算的函数
日期和时间函数:用于日期、时间转换操作。
进程控制函数:在C程序中,可以使用进程控制函数对Linux的进程、线程、管道进行管理。
查看头文件:
cd /usr/include
ls
vim 可以查看里面的帮助文档
六、字符与字符串
1、字符测试函数
所谓字符测试,是指对一个字符的大小写、是否可以打印、是否可以显示、是否是数字等方面进行判断。对应的头文件ctype.h
ctype.h头文件函数
函数名 作用 使用方法 isalnum 检查参数c是否为英文字母或阿拉伯数字,是返回1,否返回0 int isalnum(int c) isalpha 检查参数是否是英文字母,是返回1,否返回0 int isalpha(int c) isgraph 判断一个字符是否是可打印字符 int isgraph(int c) islower 测试一个字符是不是小写字母 int islower(int c) isupper 测试一个字符是不是大写字母 int isupper(int c) isdigit 测试一个字符是否是0~9之间的阿拉伯数字 int isdigit(int c) ispunct 测试一个字符是否为标点符号或特殊符号 int ispunct(int c) isspace 测试字符是否为空格 int isspace(int c) isxdigit 测试字符是否为十六进制字符 int isxdigit(int c) iscntrl 测试字符是否为ASCII码的控制字符 int iscnctrl(int c) isascii 测试字符是否为ASCII码字符 int isascii(int c)
2、字符串转换
stdlib.h头文件函数
函数名 作用 使用方法 atof 将字符串转换成一个浮点型变量(去除无关字符) double atof(char *nptr) atoi 将一个字符串转换成整型数(去除无关字符,小数点后面的字符也会被去除) int atoi(char *nptr) atol 将一个字符串转换成长整型数(字符串前面的0跳过,字母后面的会被省略) long atol(char *nptr) ecvt
gcvt
fcvt
将一个浮点型数转换成字符串(值只取数字,四舍五入) char *ecvt(double number,int ndigits,int *decpt,int *sign)
number:一个double型的浮点数,函数需要对这个浮点数进行转换。
ndigits:在浮点数中从左向右取的位数。
decpt:一个整型数的指针,显示浮点数中小数点的第几位。
sign:一个整型数的指针,代表数值的正与负,如果为正则返回0,否则返回1.
tolower和toupper 把一个字符转成小写或者大写字符 int tolower(int c)
int toupper(int c)
strtod 将字符串转换成浮点型数 double strtod(const char *nptr,char **endptr) strtol 将字符串转换成长整型数 long int strtol(const char *nptr,char **endptr) strtoul 将字符串转换成无符号长整型数 unsigned long int strtoul(const char *nptr,char **endptr) toascii 将整型数转换成合法的ASCII码字符 int toascii(int c)
未完待续