一:数据结构
c语言中数据类型包括:基本数据类型,构造类型,指针类型,空类型。
1.基本数据类型:整数型,浮点型,字符型。
1.1.整数型
整型包括短整型、整型、长整型,它们都分为有符号和无符号两种版本。
无符号字符型(usigned char),占1个字节。范围0~255
短整型(short)占2个字节,范围-32768~32767
无符号短整型(unsigned short )占2个字节,范围0~65535
基本整型(int)占4个字节,范围 -2147483648 ~ 2147483647
无符号整型(unsigned int )占4个字节,范围 0 ~ 4294967295
长整型(long)占4个字节,范围-2147483648~ 2147483647
无符号长整型(unsigned long )占4个字节,范围0 ~ 4294967295
双长整型(long long)占8个字节,范围-9223372036854775808~ 9223372036854775807
短符合双长整型(unsigned llong)占8个字节,范围0 ~18446744073709551615
1.2.浮点型
float:单精度浮点型,占4个字节
double:双精度浮点型,占8个字节
1.3.字符型
char用于存储单字符,占1个字节。范围-128~127
2.构造类型
构造类型包含结构体(struct),共用体(union)、枚举(enum)
2.1结构体类型
结构体定义:
数据类型 变量名1;
数据类型 变量名2;
............
数据类型 变量名n;
};
例
struct student{
char name[8];
int age;
char sex;
};
上面的定义仅仅类似于基本数据类型中的数据名称。
结构体变量定义:
struct 名称{
数据类型 变量名1;
数据类型 变量名2;
.........
数据类型 变量名n;
}结构体变量名1,结构体类型名2;
例
struct{
char name[8];
int age;
char sex;
}stu1,stu2,stu3;
2.1.1结构体类型赋值:
1.直接赋值
stu1.age=11;
2.整体赋值
stu1= (struct Student){"Chenhao", 21, "男"};
2.2共同体也成联合体
联合体定义
union 名称{
类型变量符 变量名;
......
类型变量符 变量名;
};
其定义与变量定义和结构体类似,在联合体中,所有的成员变量共享一块内存空间。该内存空间是其成员变量中占字节数最多的变量所占用的内存空间,联合体中所有成员变量地址是一样的。
3.指针类型
指针的定义及赋值:
类型说明 *变量名
列如 int *p;//定义一个指针变量p,指向整形变量
int a,*p;
a=3; p=&a;
#include<stdio.h>
void main(){
int a = 3, *p; /* 定义整型变量a和整型指针p */
p = &a; /* 把变量a的地址赋给指针p,即p指向a */
printf("a = %d, *p = %d\n", a, *p); /* 输出变量a的值和指针p说指向变量的值 */
*p = 10; /* 对指针p所指向的变量赋值,相当于对变量a赋值 */
printf("a = %d, *p = %d\n", a, *p);
}
运行结果:
a=3,*p=3
a=10,*p=10
指针可以指向数组,定义一个数组并初始化,int sushu[4]={2,3,7,11},定义一个指针变量并把数组的地址赋给它,int *p=sushu,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素3,即*(p+1)=3;
4.空类型
即void类型,其可以表示一种未知类型,当其作为返回值时表示无返回值,修饰指针类型时表示未知类型指针。
二、运算符,表达式及语句
1 算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
++a,--a 先运算a加一或减一,再取值。
a++,a-- 先取值,再运算a加一或减一。
2.关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)
、小于等于(<=)和不等于(!=)六种。
3.逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4.位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5.赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符
这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符
用于把若干表达式组合成一个表达式(,)。
8.指针运算符
用于取内容(*)和取地址(&)二种运算。
9.求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→,.)等几种。
三、循环
1.while循环
while(表达式)
{
循环体;
}
表达式表示循环条件,当值为真时,执行循环体代码。
2.do-while循环
do
{循环体;
}while(表达式);
先执行循环体中的代码,再判断while中的表达式是否为真,若为真,则继续循环,若为假则停止循环。
3.for循环
for(表达式1;表达式2,表达式3)
{循环体;
}
执行表达式1,对循环体变量进行初始化;判断表达式2,若值为真,则执行循环体,若为假,则结束循环,再执行表达式3.
四、分支与跳转
1.if(表达式)
{
执行语句1
}
else
{
执行代码2
}
若表达式为真,则执行语句一,反之执行语句2
2.switch语句
switch(表达式)
{
case 表达式1:
执行语句1
case 表达式2:
执行语句2
.....
}
按照逻辑表达式的值跳转到相应的case标签处。然后程序流程继续通过所有剩余的语句,直达再次由break语句重定向。逻辑表达式和case标签必须都是整型值(包括类型char),并且标签必须是常量或者完全有常量组成的表达式。如果没有与表达式值相匹配的case标签,那么控制定位到标签为default的语句,如果它存在的话。否则,控制传递给紧跟着switch语句的下一条语句。
四、函数
函数可以分为有参函数和无参函数,还可以分为标准和自定义函数
1.无参函数定义:
类型说明符 函数名()
{
语句
}
2.有参函数定义:
类型说明符 函数名(类型说明符1 参数1,类型说明符2 参数2 ....)
{
语句
}
int sum(int m, int n){
int i, sum=0;
for(i=m; i<=n; i++){
sum+=i;
}
return sum;
}
函数定义时给出的参数称为形式参数,简称形参;函数调用时给出的参数(也就是传递的数据)称为实际参数,简称实参。函数调用时,将实参的值传递给形参,相当于一次赋值操作。
函数的返回值通过return实现,
五、数组
一维数组
列:int a[5]; char c[5];
上述定义了一个int整型数组,数组名为a,定义的数组称为数组 a。还定义了一个字符类型的数组,数组名为c,定义的数组称为数组 c。
数组初始化 int a[5]={1,2,3,4,5};char c[30]="hello";
二维数组
int a[3][4]; char c[5][6];
定义一个3行4列的二维整型数组a,定义一个5行6列的二维字符型数组c,在定义二维数组时,可以不指定行(第一维)的长度,只指定列(第二维)的长度。
char c[5][5]={
"hgbv"
,
"jhg"
,
"jhgf"
,
"iuh"
,
"jjhs"
};
int a[][4]={{0,0,3},{2},{0,10}};
二维数组的使用:
#include<stdio.h>
void main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
arr[i][j] = i * 5 + j + 1;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
六、宏定义
宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中出现的PI全部换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义可以嵌套
(8)字符串" "中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
带参数的宏定义:
格式:
#define 宏名(参数表) 字符串
例如:#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;