830复习

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)全局变量存储类别

  1. 在一个文件内扩展外部变量的作用域
    关键字extern 表示将变量的作用域扩展到此位置。
  2. 将外部变量的作用域扩展到其他文件
    在一个文件中定义一个变量A,在另一文件中用extern对A做外部变量声明。
  3. 将外部变量的作用域限制在本文件中
    可以用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的树)前序中序,叶子结点
★图(关键路径,存储结构)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值