一:数据结构

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;