收藏 分销(赏)

C语言笔试必考知识点2.doc

上传人:xrp****65 文档编号:6908873 上传时间:2024-12-23 格式:DOC 页数:17 大小:64.50KB 下载积分:10 金币
下载 相关 举报
C语言笔试必考知识点2.doc_第1页
第1页 / 共17页
C语言笔试必考知识点2.doc_第2页
第2页 / 共17页


点击查看更多>>
资源描述
第九章函数 知识要点: 1一维说组的定义: 1) 当数组中每个元素只带一个下标时,称这样的数组为一维数组。 2) 定义一维数组的一般形式为: 类型名 数组名[ 常量表达式]…….. 例如:int a[8]; 说明如下: (1) 定义一个名为a的一维数组。 (2) 方括号中8规定a数组中有8个元素(a[0]到a[7]) (3) 类型名int 规定a数组中每个元素为整型,且每个元素中只能存放整型数。 (4) 每个元素只有下标且第一个元素的下标总为0 (5) C语言编译程序为a数组开辟8个连续的存储单元。 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 3) (1): 在定义数组语句中,可以有多个数组说明符,他们用逗号隔开。 例如:double a[22],b[100], c[5]; (2):数组说明符和普通变量名,可以同时出现在一个类型的定义语句中。 2.一维数组的引用 1)引用形式如下:    数组名[下标表达式]例如:double a[8];则a[0],a[j],a[i+k] 都是合法的。 注意:a[i+k]中i+k是下标表达式不是两个下标 2. (1):一个数组元素实际上就是一个变量名。代表内存中的一个存储单元。 (2):一个数组不能整体引用,数组名中存放的是一个地址常量,它代表整个数组的首地址。 (3)在引用数组元素时,数组元素下标表达式必须是整数,下标表达式下限为0。系统并不会自动检验数组元素下标是否越界,因此编程时候要多注意。 3.一维数组的初始化。 1) 在定义语句中给所定义数组赋初值    初值放在赋值号后的花括号中,数值类型与说明类型一致,初值间用逗号隔开,系统将自动按顺序从a[0]开始依次给a数组中元素。如int a[8]={0,1,2,3,4,5,6,7}; 2) (1)当初值少于元素个数时,后面元素赋给0。字符补给‘\0’ 例如:int a[10]={0};十个元素都赋初值0  char a[5]={‘A’}; char a[5]={‘A’,’\0’, ’\0’, ’\0’, ’\0’,}; (2)当初值多于元素个数,系统给出出错信息。 3)可以通过赋初值来定义数组的大小   例如:int a[]={0,0,0,0,0,0}; int a[6]={0}; 4举例说明:    (见课本)编写程序,定义一个含有30个元素的int 类型数组,依次给数组赋 1 3 5 7 9….然后按每行10个顺序输出,最后在按每行10个逆序输出。  第二节:一维数组和指针 1) 数组和指针比较记忆: (1) 指针变量的地址(每个变量的地址就是该变量的第一个字节的地址)数组名的地址值,就是该数组第一个元素的地址。 (2) 指针变量有基类型,相当于数组的类型名 (3) 指针变量的地址值是不可以改变,因此不可以给数组重新赋值。p=&a; 语句a=&x;或a++;都是非法的,因为不能给a重新赋值,一但定义,a永远指向a数组的首地址。 2) 虽然不可以改变a 中的 内容,但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。Int a[10],*p,x; 例如:(k为int ) p=a+k; for(k=0;k>10;k++) scanf(“%d” ,a+k); 语句p=&a[0]== >p=a;指向a数组首地址: 以下语句是等价的:    for(p=a,k=0;k>10;k++) p++; for(p=a,k=0;k>10;k++) {scanf(“%d”,p);p++} for(p=a,k=0;k>10;k++) scanf(“%d”,p++); for(p=a;p-a<10;p++) scanf(“%d”,p); 2. 通过数组首地址,指针,带下标的指针引用一维数组 1)*&a[i] *(a+i) (p=a;||p=&a[0]; ) *(p+i) a[i] p[i] 数组a 若有:p=a; (a[i] *(a+i) p[i] *(p+i) ) 以上是数组元素a[i],一对方括号不仅是表示数组元素的记号,也是一种运算符。 看下面的式子: &a[i] a+i p+i 以上是a[i]的地址   *(p--) a[i--] *--p a[--i] (2)a和p的区别:a是不可以改变的,p中的地址值却是可以改变的, 因此 a++;a=p,p=&a非法 p++,p=a,p=&a[i] 合法 3) 逐个输出a数组中元素的值。 for(k=0;k<10;k++) printf(“%4d”.*(a+k)); for(k=0;k<10;k++) printf(“%4d”.a[i]); for(p=a,k=0;k<10;k++) printf(“%4d”,*(p+k)); for(k=0;k<10;k++) printf(“%4d”.p[i]); 第三节函数之间对一维数组和数组元素的引用及一维数组实例: 1. 数组元素作为实参: 在调用函数时,数组元素可以作为实参传递给形参,每个数组元素实际代表内存中的一个存储单元和普通变量一样,对应的形参必须是类型相同的变量。 2. 数组名作为实参 数组元素的值,可以传递给该变量,在函数中只能对用该变量进行操作,而不能直接引用对用数组元素,数组名也可以作为实参传送,,但数组名本身是一个地址值,因此对应的形参应该是一个指针就变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应数组元素进行操作。 例如:编写程序:通过函数给数组输入若干大于等于0的整数,用负数作为结束标志,调用函数输出该数组中的数据。 1) 当数组名作为实参时,对应的形参可以是:       (1) fun (int *a) (2) fun(int a[ ]) (3) fun(int a[M]) 2)此处*(a+i) ====> a[i] 3.数组元素地址作为实参:   当数组元素地址作为实参时,因为是地址值,所以对应的形参也应该是类型相同的指针变量 例如:编写程序,对具有10个元素的char类型数组,从下标为4的元素开始,全部置‘*’,保持前四个元素内容不变。  注:setsar 函数首部可写为: Setsar(char a[ ],int n) 或 setsar (char a[M-B], int n) *(a+i)可以写为 a[i] 程序(略): 4.函数的指针形参和函数体中数组的区别: 例如:以下程序,形参a指向w数组,函数体内定义了一个数组b,函数把b数组的启始地址作为函数值返回,企图使指针p指向函数体b数组的开头。  #define N 10 Int *fun(int a[N],int n) { int b[N]; … … Return b; } Void main() {int w[N] ,*p; … …. P=fun(w,N); … … } 以上程序涉及几个概念: 1) 函数fun中,形参a可以写成a[N],a[ ],*a,它是一个指针变量,在调用fun函数时,系统只为形参a开辟一个存储单元,并把main函数中w数组首地址存进去,使它指向w数组地址。 2) 函数fun的函数体定义了一个b数组,在调用fun函数时,系统为它开辟一串连续存储单元,它是一个地址常量。 3) 在fun函数执行完毕后,系统释放a,b所占存储单元,而b的值作为fun函数返回值,指针变量p将不指向任何对象而成为“无向指针。“ 一维数组的应用举例: 1. 编写程序:定义一个含有15个元素的数组,完成以下操作: (1) 调用C库函数中的随机函数给所有元素赋以0~50之间的随机数。 (2) 输出数组元素中的值 (3) 按顺序对每隔三个数求一个和数,并传回主函数。 (4) 最后输出所求的和值 2. 编写程序,将数组中数,按颠倒的顺序重新存放。 3. 编写程序,查找在已知数组a中和k相同值的元素的位置,若找到就输出 数组a中该值和所在的位置,若没有找到输出“没有找到”。 4. 编写程序:删除已知存放n个元素的数组a中,下标为k的元素。然后在验证。 5. 用选择法(冒泡法)对数组a中的数进行排序。 第二节:二维数组 1. 二维数组的定义、引用和赋初值 (一) 二维数组的定义和引用 1. 格式: 类型名 数组名[常量表达式1][常量表达式2]; 定义 数组名[常量表达式1][常量表达式2]; 引用 2. 图解:(略) 3. 引用: 考点: 1)行列下标下限为0,上限为 n-1 2)一定要使两个下标放在两个括号内。 3) 第m行n列:a[m-1][n-1] (二)二维数组的初始化: 1.正常格式: int a[3][4]={{1, 2, 3, 4 }, {5, 6, 7, 8 }, {9,10,11,12} }; 2.缺省:行、列、不带花括号,后自动补0。(只能省略行下标,不能省略列下标) 3.通过赋初值定义二维数组大小。 (三)二维数组遍历方法(双for循环) 例题:通过键盘给2*3的二维数组输入数据,第一行赋1、2、3、第二行赋10、20、30、然后按行输出此二维数组。 二维数组和指针: (一):二维数组名和指针 1.数组名存放的是内存中该二维数组首地址:即&a[0][0] 如:p=a,即p=&a[0][0],如上图。 (二) 二维数组元素表示方法 1.a[i][j] : 正常格式 2.(*(a+i))[j] : a[i] -?*(a+i) a[i][j] -? (*(a+i))[j] 3.*(a[i]+j) : a[i] 中存放的是每行的首地址,可以将一行看成一个一维数组,将a[i]看成一维数组名。 a[i][j] -? *(a[i]+j) 4.*(*(a+i)+j) : a[i]--? *(a+i) *(a[i]+j) *(*(a+i)+j) 5.*(&a[0][0]+4*i+j) : 若有整型数组a[3][4],可先将二维数组看成一维数组.从首地址开始向上每行元素个数*前面的行数+所在列数,表示当前元素的地址 三:指针数组和行指针 1. 指针数组: 1) 概念:定义一个一维数组,数组中每一个元素都是一个整型指针变量。 2) 图解:(略) 指针数组中每个指针都指向二维数组的一行,也可以说每个指针存放一行的首地址。 3) 赋值方法(双for循环) for(i=0;i<3;i++) p[i]=a[i]; a[i]是每行的首地址 4) 指针数组引用指针元素 (1) p[i]存放一行的首地址与a[i]相同 *(a[i]+j)-?*(p[i]+j)-? a[i][j]-?p[i][j] ( 2 ) p[i] -----? *(p+i) *(p[i]+j) --------?*(*(p+i)+j) p[i][j] -------? (*(p+i))[j] 2. 行指针: 1) 概念:定义一个指针变量q,它指向一个包含两个整型元素的数组。 int a[3][2] , (*q)[2]; 2) 图解: 3) 赋初值 若 q=a,则q+1 a+1 a[1] 4)行指针引用数组元素。 (1)因为q=a,所以a的引用方法均适用q(最后一项除外) (2) *(a[i]+j) <?*(*(q+i)+j) (*(q+i))[j] <?q[i][j] 二、二维数组名和指针数组作为实参(考点) (一)二维数组名作实参 1.当实参为二维数组名时,形参必为指针,并且这个指针应指向数组,指向数组的指针变量为行指针。形参对应格式,即行指针应为:(*a)[N] 2.行指针也可以表示成a[M][N] 3.行的表达式可以缺省 a[ ][N] (二)指针数组做实参 1.由于指针数组中每个元素均为指针,因此对应形参应当是指向指针的指针 **a 2.与指针数组表示方式相同*a[M] 3.缺省 *a[ ] 三:典型例题: 1. 编写程序通过调用随机函数给5*6的二 维数组元素赋10—40的整数,求出二维数组每行元素的平均值。 2. 编写函数打印杨辉三角形。 3. 找出方阵每列中的最小元素及所在的行号。 4. 编写函数,把任意十进制转换成二进制数。 5. 行列互换(多种方法) 第十章 字符串: 一:用一个一维数组来存放字符串。 一:定义字符串 : 1. 字符串的定义格式: 1)‘\0’ 是一个转义字符。称为“空值”。他的ASCII代码值为0。‘\0’作为标志占用存储空间,但不计入串的实际长度。 2)strlen计算串的长度时不记‘\0’,sizeof计算串长度时候计算’\0’. 3)由于字符串以’\0’结尾,所以若要定义一个函有10个字符 的字符串,则需要一个11元素的一维字符数组。 例如:char str[10]={‘a’,’b’,’c’,’d’,’e’,’f’} 数组str工有10个元素,str作为字符串,其长度为7 2. 字符串和字符型数组的区别。 1) 一维数组中不一定要存放字符串,但字 符串一定要存放在一维数组中, 2) 字符数组中的每个元素可存放一个字符,但它并不限定最后一个字符应该是什么 3) 可以给字符内存中存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋给字符串变量。如:str1=str2(是错误的) 二:字符串赋初值; 1. 为字符串赋初值 1) 在定义语句中赋初值 (1) char str[10]={‘a’,’b’,’c’,’d’,’e’,’f’} 注意:数组元素个数一定要多于字符个数。 (2) char str[10]={“abcdef”}; (3) char str[10]=”abcdef”; (4) char str[ ]=”abcdef”; 2)在执行语句为字符串赋初值: (1)在执行语句部分不能直接为字符串赋初值。 例如:char str[10]; str=”abcdef”;(是错误的) (2) 可以用 for循环在执行语句给字符串赋初值。 例如: for(i=0;i<6;i++) str[i]=i;str[6]=’\0’ ; 2给字符型指针赋初值: 1) 在定义语句同时赋初值。 (1) char str[10]= “abcdef”,*q=str; (2) char *q =”abcdef”; 2)在执行语句赋初值: char *q; q=”abcdef”; 3. 字符把字符串赋给字符形数组和赋给字符型指针的区别: 把字符串赋给字符型数组代表在内存中开辟了一片连续的存储单元。把该字符串放到这片存储单元中去。 把字符串赋给字符形指针,代表一个指针指向一个字符串,但并没有为它开辟存储单元。 一:输入和输出字符串时的必要条件 1. 输出项既可以是字符串或字符数组名,也可以是已指向字符串的字符指针变量。 2. 输入项可以是字符数组名,也可以是字符指针,但不能是一个字符串。 二:用格式说明符%s进行整串输入和输出 1. scanf 函数 1) 用%s格式输入字符串时,空格和回车都作为输入数据的分隔符而不能被读入; 2) 若字符串长度超过字符数组所能容纳的字符个数时,系统并不抱错。 3) 当输入项为字符指针时,该指针必须已指向确定的有足够空间的连续存储单元。 4) 当输入项是数组元素地址时,输入数据将从这一元素开始存放。 看下面的一个例题: main() {char a[10]=”*********”; scanf(“%s”,a); scanf(“%d”,&a[5]);*/ printf(“%s”,a);} 2. printf函数 调用printf函数时候,将从这一地址考试,依次输出存储单元中的字符,直到遇到第一个‘\0’为止。‘\0’是结束标志,不在输出字符之列。输出结束后不自动换行。 三:调用 gets、puts函数,从终端进行字符串行的输入和输出。 例如:main() {char a[10]=”abcdef\0g”,*p=a; Printf(“%s\n”,a); Printf(“%s\n”,p); Printf(“%s\n”,”abcdefg”); Printf(“%s.&a[5]”); Printf(“%s\n”,a); } 1. gets函数。 1) 头文件:#include “stdio.h” 2) 格式:gets(str); 3) gets 函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。 例如:main() { char a[10],b[10]; scanf(“%s”,a);gets(b); printf(“%s\n”,a); printf(“%s\n”,a);} 2. puts函数 1) 头文件:#include <stdio.h> 2) 格式:puts(str); 3) puts函数输出结束后,自动输出一个换行符。 三字符串数组: 一:概念: 1. 所谓字符串数组就是数组中的每个元素都是一个存放字符串的数组。 2. 可以将一个二维字符数组看成一个字符串数组,二维字符数组的第一个下标决定了字符串的个数,第二个下标决定了字符串的最大长度。所以把他看作一个字符串数组。 3. 字符串数组也可以在定义的同时赋初值。 例如:char a[3][5]={“a”,”bb”,”ccc”}; char a[ ][5]={“a”,”bb”,”ccc”}; 4. 可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。 例如:char *pa[3]={“a”,”bb”,”ccc”}; 二:字符串数组的操作: 1. 输出字符串数组 main() { char i ,a[3][10]={“abc”,”aa”,”cc”}; for(i=0;i<3;i++) printf(“%s”,a[i]);} 2. 字符串排行; 3. 通过指针输出字符串 4. main() {char x[10]}=”asqrtpyx!”,i,j; for(i=0;i<10;i++) printf(“%c”,x[i]);} 四:用于字符串处理的库函数 1. 字符串复制(拷贝)函数strcpy,调用形式如下:    strcpy(s1,s2); 功能:把s2所指的字符串(源)的内容复制到s1所指的存储空间(目的)中,函数返回s1的值,即目的串的首地址;  注意:为保证复制的合法性,s1必须指向一个足够容纳s2串的空间; 2. 字符串连接函数strcat,调用形式如下:   strcat(s1,s2); 功能:将s2串连接到s1串的后面,并自动覆盖s1串末尾的’\0’,函数返回s1的地址值;  注意:s1所指字符串应有足够的空间容纳两串合并后的内容; 3.求字符串长度函数strlen,调用形式:     strlen(s); 功能:统计以s为首地址的字符串的长度,并作为函数值返回,这一长度不包括串尾的结束标志’\0’; 4. 字符串比较函数strcmp,调用形式:     strcmp(s1,s2); 功能:用来比较s1和s2所指字符串的大小,若串s1>串s2,函数值大于0(正数);若s1==s2,函数值等于0;若s1<s2,函数值小于0(负数) 比较方法:依次对s1和s2所指的字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(即两个字符的ASCII值相减);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服