830复习

    科技2022-07-12  149

    830(C语言+数据结构) C语言重难点: 一、函数: 1.函数 (1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。一个源程序文件由一个或多个函数以及其他有关内容(指令、数据声明与定义)组成,一个源程序文件是一个编译单位。C程序的执行从main函数开始,所有函数都相互独立,不可以嵌套定义,可以相互调用,但不可以调用main函数。 (2)函数分类: 从用户使用角度看,分为库函数和用户自己定义的函数。 从函数形式看,分为无参函数和有参函数。 (3)函数定义: 所有函数必须先定义,后使用。 定义函数应包括:指定函数的名字、类型、参数的名字和类型、功能。 2.函数调用 (1)调用形式: print_star();//函数调用语句 c=max(a,b);//函数表达式调用 m=max(a,max(b,c));//函数参数调用 在函数调用过程中,系统会把实参的值传递给被调用函数的形参。在调用函数过程中发生的实参与形参间的数据传递,常称为虚实结合。实参向形参的数据传递是“值传递”,是单向传递,只能由实参传给形参。 (2)递归调用 int fac(int x) { int f; if(n<0) printf(“n<0,data error!”); else if(n0 || n1) { f=1; } else f=fac(n-1)*n; return (f); } 3.数组作为函数参数 数组元素可以作为函数实参,向形参传递数组元素的值。此外,数组名也可以作为实参和形参,传递的是数组第一个元素的地址。 4.变量 (1)定义变量 有三种方式:在函数开头;在函数内的复合语句内定义;在函数的外部定义。 局部变量是在函数内部定义的变量。 全局变量是在函数外部定义的变量。 (2)局部变量存储类别 自动变量(auto变量)存储在动态存储区 静态局部变量(static局部变量)存储在静态存储区 寄存器变量(register变量)存储在CPU的寄存器中 (3)全局变量存储类别

    在一个文件内扩展外部变量的作用域 关键字extern 表示将变量的作用域扩展到此位置。将外部变量的作用域扩展到其他文件 在一个文件中定义一个变量A,在另一文件中用extern对A做外部变量声明。将外部变量的作用域限制在本文件中 可以用static声明

    【例1.1】下列说法中错误的是C A、变量的定义可以放在所有函数之外 B、变量的定义可以放在某个复合语句的开头 C、变量的定义可以放在函数的任何位置 D、变量的定义可以不放在本编译单位中,而放在其他编译单位中 【例1.2】外部变量对程序中的任一函数而言是B A、存在的 B、可直接存取的 C、不可见的 D、不可直接存取的 二、指针: 1.定义和引用指针: int *p;//定义一个指针变量 p=&a;//给指针变量赋值 printf("%d",*p);//引用指针变量所指变量的值 printf("%o",p);//引用指针变量的值(即所指变量的地址) 2.通过指针引用数组: (1)引用一维数组: int p=&a[0]; 等效于 int p; p=&a[0]; 或 int p=a;(数组名只代表数组首元素的地址) 在指针指向数组元素时,可以对指针变量进行以下运算: p+1//指向同一数组的下一个元素,执行p+1时是给地址加上一个数组元素所占用的字节数,而不是简单地加1(int,float,long 字节为4 char 字节为1) p-1//指向同一数组的上一个元素 p++,++p p–,--p p1-p2(仅当p1和p2指向同一数组元素时才有意义,所指元素的相对距离) 若p的初值是&a[0],则p+i和a+i就是数组元素a[i]的地址,而 (p+i)和(a+i)是所指向的数组元素,即a[i]。 可以用p++使p的值不断改变从而指向不同的元素,但a++不可以。因为a代表数组首元素的地址,是一个指针型常量,值是固定不变的。 引用数组元素: 下标法。printf("%d",a[i]); 指针法。printf("%d",(a+i)); 【例2.1】定义char aa=“12345”;,执行printf(’’%c",aa++);后,正确的输出结果为: 【分析】aa为数组名,代表数组首元素地址,值固定不变,所以aa++相当于输出数组首元素的值。 【答案】1 【例2.2】设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则下列不能正确执行的语句是( B) A.k=p1+p2 B.p2=k C.p1=p2 D.k=p1(p2) 【分析】p2是指针型变量,而k是int型变量,不能直接将k赋给p2,可以将k的地址赋给它。 (2)引用二维数组: int a[3][3]={{1,2,3},{3,4,5},{5,6,7}}; a代表二维数组首元素的地址,同时也代表的是首行(序号为0的行)的首地址。a+1代表序号为1的行的首地址,它的值即a[1]的首地址。 0行首地址:a 0行0列元素地址:a[0],(a+0),a 0行1列元素地址:a[0]+1,或(a+0)+1 1行首地址:&a[1],a+1 1行0列元素地址:a[1],(a+1) 1行1列元素地址:a[1]+1,(a+1)+1,&a[1][1] 1行1列元素的值:(a[1]+1),((a+1)+1),a[1][1] 3.通过指针引用字符串 char *string=“I love China!”;//string是字符指针变量 等价于 char *string; string=“I love China!”; printf("%s\n",string); 4.指向函数的指针 在程序中定义一个函数,编译时系统为函数代码分配一段存储空间,这段存储空间的起始地址(入口地址)就称为这个函数的指针。 int (*p)(int,int) 给函数指针变量赋值时,给出函数名即可。 p=max;//将max函数入口地址赋给p c=(*p)(a,b)//调用由p指向的函数,实参为a,b。得到的函数值赋给c 5.指针数组 (1)定义 int *p[4]; 指针数组适合指向若干个字符串,使字符串处理更加灵活。 char **p;//定义指向指针的指针 相当于char *(*p);

    int main() { char *name[]={"Math","English","Biology","Physics","Chemistry"}; char **p; int i; for(i=0;i<5;i++) { p=name+i; printf("%s\n",*p); } return 0; }

    运行结果: Math English Biology Physics Chemistry 【另】若将main函数中的printf("%s\n",*p);改成printf("%d\n",*p);则运行结果是 4210688 4210693 4210701 4210709 4210717 各个电脑运行结果可能不一样。 p是指向char * 型数据的指针变量,即指向指针的指针。*p是字符串首字符的地址。 (2)指针数组也可以做main函数的形参。 int main(int argc,char *argv[]) argc和argv是程序的命令行参数。main函数是操作系统调用的,所以实参只能由操作系统给出。在操作命令状态下,命令行包括了命令名(可执行文件名)和需要传给main函数的参数。 例如 file1 Math English 6.动态内存分配与指向它的指针变量 全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个栈。临时数据则存放在一个特别的自由存储区,称为堆。 void *malloc(unsigned int size);//开辟一个长度为size的连续空间。 void *calloc(unsigned n,unsigned size);//分配n个长度为size的连续空间。 void free(void *p);//释放指针变量p所指向的动态空间。 void realloc(void *p,unsigned int size);//在获得动态空间后,可以利用该函数重新分配空间改变其大小。 三、C语言程序设计

    四、C语言填空题 1.C语言基本的数据类型包括:整型、实型(浮点型)、字符型 数据结构 ★时间复杂度 ★栈的输入输出序列 ★数组存储单元计算 ★线性表(顺序表和链表的概念,存储结构,插入删除结点) ★二叉树(度为2的树)前序中序,叶子结点 ★图(关键路径,存储结构)

    Processed: 0.013, SQL: 8