计算机之路————C语言基础快速复习3
函数强化:
C语言的函数名实际上是函数的入口地址。
若被调用函数(非void型)没有return语句,将会带回一个不确定的值。
C语言中,子程序体现为函数,程序的每一个模块是函数
形参与实参;无参函数(没有形参)
main函数的缺省类型为int型。当然可以写为void型
函数名字,各个实参的计算次序是依赖于实现的,可能从左向右计算也可能从右向左计算还可能并行计算。
因此函数名,各个实参的值不要依赖于他们的计算次序
printf("...",*pa,*pb,*pa=*pa+*pb)//参数计算次序从右往左!!!//输出是从左到右
数组强化:
三种构造性数据类型:数组,结构体,共用体;
int a[5][2][26][5][3]; //a[0][1]仍然合法!会把后面的[26][5][3]当做一个基础类型(三位数组)
数组声明,最外层可以不指明本维元素个数。int a[]={...}; int a[][4]={...};
字符串是常量字符数组;字符数组是字符串变量;
常量字符串,系统自动添加结束标志。变量字符串,程序员必须手动加结束标志。
char name[20]="aaa";等价于 char name[20]={'a','a','a','\0'};
strcpy(st1,st2);//st2赋值给st1
strcat(str1,str2);//连接到str1后面
线性表:类型相同,首项没有前驱,末项没有后继,其他项排成一行。数组是典型的线性表。
分类
最简单的分类是排序
主元排序(每次从中选出一个最小/大的,放在第一个。然后从剩下里面选出最小的放在第二个位置,......)
冒泡排序(不断交换)
检索
在给定的数据集合中查找某特定数据
顺序检索
对半检索(已排好序)
栈:特殊的线性表;先进后出;所有操作在栈顶
压入(不保证越界)
弹出(判空)
队列:先进先出;环形队列;首指针尾指针(指向队列中第一个可取单元;指向队列中第一个空单元;)
入队
出队
应用:括号配对,字符处理。
类型定义: typedef 类型名 标识符 (typedef意思也就是:给类型起个别名!后面方便使用)
两个特殊的使用:
给数组类型起别名:typedef int arr[10];定义了一个别名arr,类型是int[10]的数组;arr a;相当于int a[10]
给枚举类型起别名:typedef enum color{...} tcolor; tcolor c;
查漏:
break跳出的是循环语句(for,while,do-while)并不是if-else。
switch-case语句当中也要用到break跳出每一个case
char c='s';变量c,内存中存了一个字符s,但实际上存放的是‘s'对应的ASCII码
直接访问:p+10 间接访问:(*v)+10
指针:
设有类型T,则任何一个类型都有一个指向该类型的指针类型:T* 指针是一种特殊的变量,通常存储的是十六进制的地址。
空指针(值为NULL):表示指针变量的值为空,不指向任何变量或者函数,通常对于整数值0
NULL是一个值,它的类型:属于所有指针类型!可以对任何指针进行操作。(判等)
void*是一个类型,用来表示不知道基类型的指针(表示任何类型的指针)
指针运算:减法;赋值;加法没有意义不允许两个指针做加法;判等;判空(NULL);数组名是个常量指针,不可以a++这种运算!指针变量可以。
*p++即*(p++) *++p即*(++p)
指向指针的指针:
int **P;
数组名是常量指针。指针可以看做长度为1的数组。
多维数组与指针:
C语言按照行优先原则分配数组元素存储空间;首先分配第一行,再分配第二行,,,
(内存地址从小到大依次分配)(图片展示就是从下到上;上面地址大;)
a[3][3];
让ptr指向a[0][0]:
ptr=&(a[0][0]);
ptr=a[0];
ptr=*a;
//a指向a[0], a[0]指向a[0][0]
//再高维数组以此类推!a指向a[0], a[0]指向a[0][0],a[][]指向a[][][]......
指针数组:基础元素是指针;声明形式:T* array[n];
指针与字符串:
字符串:常量字符串(常量字符数组,存储在常量区),变量字符串(放在字符数组中,存在变量区)
用指针指向字符串;
字符指针可以指向一个字符串;字符数组可以存一个字符串!
一个字符数组可以存多个字符串,字符串之间有分隔符'\0'即可
结构体:把不同类型捏成一个结构体类型
可以把数组看成是一个特殊的结构体,里面的元素类型都必须一样,而结构体中的成分可以是不同类型;
struct ach{
int num;
char name[100];
int score;
};
结构体类型定义可以嵌套!
enum tgender{...};
struct date{...};
struct person{//类型定义;也可以使用typedef
int age;
enum tgender gender;
struct date birthdate;
};
结构体类型引用 struct person (没有分配空间只是一个引用,一个标记,可以把它看成是一种类型,struct person类型)
声明结构体变量:struct person xm;
指向结构体变量的指针变量;(可以用typedef起别名 )
访问成员:
直接访问,用.
间接访问(指针),用->
结构体数组
结构体指针类型做函数参数
结构体类型做函数参数
结构体可以整体赋值!结构体不允许整体运算,可以设计一个函数来进行加减乘除等运算。
char* p[4];//是四个指针,组成了一个数组,称为指针数组。
char (*p)[4];//*与p是在连在一块的,使p成为一个指针,这个指针指向一个具有4个char型数据的数组,为数组指针。p中存放了这个char型数组的首地址。
int* p=a[2][2]; p即p[0],p++即p[0]++也就是p[1],p[1]指向的是p[1][0]
C语言只有一种参数类别————值参数
函数调用:计算实参----转换成形参类型----送入形参中;(要求赋值兼容)
C语言是把数组当做指针来处理的!!!
多维数组做函数参数,声明时可以省略最外层的尺寸 int func(float y[][20]);
数组参数传递给函数的值不是整个数组的值而是数组名的值,也就是实参数组的首地址。在函数内只会给他开辟一个指针空间,不会给形参开辟整个数组空间。
函数返回值的类型:不允许是数组类型和函数类型,其他都可以,如指针类型,结构体类型!
char* func(int n){...}
递归思想:
函数里面又出现了它本身的调用!
缺点:递归的执行效率低