计算机培训 c语言知识点概要_第1页
计算机培训 c语言知识点概要_第2页
计算机培训 c语言知识点概要_第3页
计算机培训 c语言知识点概要_第4页
计算机培训 c语言知识点概要_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言章节复习

第一章:c语言概述

1、c语言的特点

1)任何一个C程序有且有一个main。函数。

2)任何一个C程序文件有且有一个main()函数,

一个C程序总是从main。函数开始执行。

3)C程序的基本单位是函数。

4)C函数的基本单位是语句。

5)C程序的每个语句必须以;结束。

6)C程序的以/**/作注释的开始和结尾。

7)C程序的每个语句可以写多行。

8)C程序的每行可以写多个语句

如:a=10;printf("%d\n",a);

9)C语言区分大小写。_

10)C语言没有输入输出语句,由函数代替。

11)“#"为编译以预处理,“include”包含语句。

12)在C只能识别半角语言字符,不能用全角。如果想输出汉字,必须在函数内用“”括

起来。

第二、三章:数据类型、运算符和表达式及标准输入输出

1、C程序的标识符只能由字母、数字、下划线组成、并且第1个字符必须为字

母___和下划线。

2、常量

整型:三种表示形式:a)十进制整数,例:12;b)八进制整数,例:012;c)十六进

制整数,如0、258、-3875、0357、0x35b、-6945L

实型:两种表示形式:a)十进制小数形式,例:123.456;b)指数形式,例:le3,2.3e-3。

13.6795、-0.58、-.45、100.、0.5e5、-12.4e-10>12.5E-2

注意:1)E后的指数部分必须为整数

2)在字母E或e的前后必须有数据

3)在字母E或e的前后及数字之间不能有空格

字符型:用''括号括起来的单个字符

1)普通字符:一、B、一、文、小、丫

2)转义字符:,\n'、'\t'、''r'、'\b'、'\\'、'\"、

3)用外”加上1~3位八进制表示一个字符(范围0~377),如35夕、3127,、\07,

用“\x”加上1~2位16进制表示一个字符,如,\x54,、,\xa7,、

字符串型:用””括号括起来的多个字符,c语言自动在后面加上。

如"Thisisamap!”、“bdWQ\\hm\bab\'89\"4A\tOU”

符号常量:#definePI3.14

#defineEOF(-1)

3、一个变量包含五个要素望、名彝、内容、地址、存储类型。

4、填写下表

类型表示占用字节数表数范围/有效位数输出格式

(视系统而

定)

整型Int2-32768-4-32767%d%o%x

无符号整型unsigned20〜65535%u%o%x

长整型Long4-2147483648+2147483647%ld%lo%lx

单精度浮点型Float4%f%e%g

双精度浮点型Double8%lf%f%e

字符型Char10-255%c

字符串型charNn%s

5、不同类型的数据进行混合运算时,数据的转换方式有两种:自动转换和强制类型转换,

其中前一种转换方式的规则是:低类型转换成高类型、赋值号右边的类型转换成左边的

类型

6、printf(“格式控制”,输出列表)

1)格式控制包括:原样输出字符、格式符、转义字符、

格式符包括(d、o、x或X、u、f、e或E、g或G、c、s、p)

2)输出列表可以是常量、变量、表达式,都是输出它们的值,各项之间用“,“分隔。

3)格式控制与输出列表类型和项数相同

4)指定宽度m或m.n

A)m表示输出的总宽度。实际宽度<m时左边补0,实际宽度>m时则按实际位数

输出。如printf(“%6d,%3d\n”,3587,3587);

B)n表示按四舍五人输出的小数位数,或表示只取字符串左端n个字符。

如printf(“%7.3f,%5.4s”,590.5327,”abcder「);

5)加L或1:用于输出long型和double型

6)加减号-:左对齐

7)加0:左边补0

7、scanf((“格式控制”,输入的地址列表)

1)格式控制包括:格式符、原样输入字符

2)地址列表一定是地址:普通变量地址、字符串数组名(首地址)

3)输入的各项之间用空格、Tab键、回车分隔。

4)格式符前加1,表示输入长整型数据(可用%ld、%加、%lx、%lu)及double数据

(可用%If、%le).

5)格式符前加数字m,用来指定输入数据的宽度,但不能指定精度m.n。

如:scanf("%3d%4d”,&a,&b);

6)%后加*m,表示跳过(丢掉)m歹

如:scanf("%4d%*3d%4d”,&a,&b);(分别输入1234567和123456789)

7)scanf()输入字符串时,遇空格则输入结束。如

8、算术运算(+、-、*、/、%、++、--)

1)两个整数相除“/“,结果为整数,两个实数相除“/“,结果为double实数。

如:50/8值:650./8值:6.125

printf(M%d,%f\n,,,50/8,50./8);结果

2)取余运算%只适用于整数,且余数的符号与被除数的符号相同。

如:50%8值:,-50%8值:

50%-8值:,-50%-8值:

3)自增自减运算

A)++i、--i:变量的值先加1或减1,然后以新值进行其他运算。

B)i++,i-:变量先以原值参与其他运算,然后其值再加1或减1,新值在下一个表

达式或语句生效。如:

main()

{inti=3J,k;

j=i++,k=i;i++;

printf(w%d,%d,%d\n,,,i,j,k);

执行i=3;j=(i++)+(i++)+(i++);后i的值是§、j的值是£

执行i=3;j=(++i)+(++i)+(++i);后i的值是、j的值是18

C)++、--运算只能用于变量,不能用于常量和表达式。

D)注意区别普通变量的自增、数组指针变量和结构数组指针变量的自增自减的意义。

如:inta=3,b[5],*p=b;

贝!Ia++、p++的意义是__________________________

4)算术运算的优先级++--、*/%、+-

9、赋值运算(=、+=、-=、*=、/=、%=、...)

a)赋值号左边必须是变量,右边可以是常量、变量、表达式。

b)赋值后变量的值变为新赋的值,原值被冲掉且无法恢复。

0赋值运算的结合性为“自右至左“。

如:执行a=10;a+=a-=a*a;后a的值:

a=5,则执行a+=a*=a-3后,a的值是

4)区别a-10>与a=a-10,~a,a«2

10、关系运算(>、<、>=、<=、==、!=)

a)关系运算的结果为:0或1

b)关系运算把非零数都看成为了1

c)>^<、>=^<=的优先级高于==、!=

11、逻辑运算(与&&、或||、非!)

a)与&&:两数都为“r结果为“1"。

b)或||:两数都为”0,结果为“0"。

c)非!:"0”的非是“1“,"1”的非是“0"。

d)优先级:!最高、&&居中、||最低。

e)注意短路现象。

12、条件运算(式1?式2:式3)

1)条件运算的优先级仅高于赋值运算和逗号运算。

2)如:x=4,y=6,z=x>y?x+y:x-y,z的值是

x=4,y=6,z=x+5>y?x+y:x-y,z的值是

x=4,y=6,z=5,z+=x+5>y+3?x+y:x-y,z的值是

13、逗号运算(式1,式2,…,式n);

1)依次计算各表达式的值,最后一个表达式的值作为整个逗号表达式的值。

2)逗号运算的优先级最低

如:表达式(x=(a=2,a+7),b=5))的值是

a=5;执行语句x=a+7,b=5;后x=;

3)一个逗号表达式可以与另一个表达式构成新的逗号表达式。

如:表达式(x=2*5,x*5),x+5的值是

4)并不是所有出现“,”的地方都作逗号运算符。(int、printLscanf)

如:printf("%d,%d\n”,(x,y,z),z);

14、sizeof()运算符

1)计算各类数据所占存储空间的字节数。

2)括号可以是常量、变量、类型说明符等

若inta,b[20];char*p="abcdefghi”;

如sizeof(5)、sizeof(5.2)、sizeof('a')、sizeof("abcde")、

sizeof(a)、sizeof(b)、sizeof(p)

sizeof(char)、sizeof(double),sizeof(strucustudent)

15、所有运算的优先级。

1级、()、[]、.、->

2级、单目运算〜、!、*、&、++、--从右向左

3、4级算术运算:*、/、%、+、-

5级、移位运算:<<»

每左移一位,等于该数*2,每右移一位,等于该数/2取整。

6、7级关系运算:>、<、>=、<=、==、!=

8、9、10级位运算:&位与、入(异或)、|位或

先化二进制,再进行位运算。其中异或算法是两位相同则为0,两位相异则为1

11、12级逻辑运算:&&、||

13级、条件运算:式1?式2:式3;从右向左

14级、赋值运算:=、+=、*=、/=、%=,结合性从右向左。

15级、逗号运算:式1,式2,…式n;

第四章:选择结构

特别要注意:C语言中是用匪可表示逻辑真的,甬也表示逻辑假的。

C语言有构造类型,没有逻辑类型。

关系运算符号:注意<=的写法,==和=的区别!(考试重点)

if只管后面一个语句,要管多个,请用大括号!

If(a),if(!a)表示什么意思

1、单分支:if(表达式)

语句;

功能:先计算表达式的值,若为“1”,则执行“语句”,然后再执行后续语句;

若为“O”,直接执行后续语句;

2、双分支:if(表达式)

语句1;

else

语句2;

功能:先计算表达式的值,若为"1”,则执行“语句1”,然后再执行后续语句;

若为“0”,则执行“语句2”,然后执行后续语句;

说明:1)应把if语句看成一条语句,分为两部分,写两行,并后缩。

2)语句包含多个条时,用{}括起来组成复合语句。

3)多分支由双分支构成。

4)else总是与最靠近的if结合。

5)多分支的形式有多种,构成if…else嵌套。

6)任何多分支都可用多个单分支完成。

7)”条件表达式”中若为与运算&&,若&&前面的式子值为0,则不再运算&&后

面的式子。如:

main。

{inta,b,k;

if(++a<0&&b—<=b-+l)ab结果

printf(M%d,%d\n5\a,b);-1550

else-454-3

printf(u%d,%d\nw,b,a);-40-3-1

printf(u%d,%d\n,,,a,b);

3、多分支:if(表达式1)

语句1;

elseif(表达式2)

语句2;

elseif(表达式3)

语句3;

else

语句4;

4、多分支:switch(表达式)

{case常量表达式1:语句1;

break;

case常量表达式2:语句2;

break;

case常量表达式n:语句n;

break;

default:语句n+1;

1)功能:先计算表达式的值,与case后的常量表达式相同时,则进入,若都不相同则

从default中进入。进入后顺序执行,遇break则退出switch语句。

2)default语句可有可无,位置可先可后。

3)表达式的结果只能是整型值或字符值,case后面一定要只能是整型常量或字符常量

表达式,如0、4、・5、3+2、50、'A'、%’等,不能i+3、“abed”等。

例:main()

{inta;

scanf(n%dn,&a);

switch(a-3)

{case1:a+=l;

case2:a+=2;

case3:a+=3;

case4:a+=4;

case5:a+=5;

default:a+=l();

)

printf(Ha=%dK,a);

}

4)写出下列程序的结果

main()

{intx,y;

scanf(u%d9,,&x);

y=i;

if(x<=0)输入X值丫值

if(x=0)5-1

y=o;00

else-41

y=-i;

printf(u%d\nv,y);

第五章:循环结构

1、while循环

while(表达式)

循环体;

2、do…while循环

do{

循环体;

}

while(表达式);

3、for循环

for(表达式1;表达式2;表达3)

循环体;

4、说明

1)理解三种循环的执行过程

条件为“1”,执行循环体;条件为“0”,退出循环,执行后续语句。

2)整个循环语句作为一个语句,写成两行,注意后缩。

3)注意与if语句区别:都有条件表达式,if语句只判断并执行一次,循则多次判断执

4)注意用简易方法分析循环。

5)注意与if语句连用时的分析

6)理解双循环的执行过程。

7)进入循环前,注意某些变量赋初值,如:求和s=0,求积n=l,排序、求最大公约数等。

8)”条件表达式”中若为与运算&&,若&&前面的式子值为0,则不再运算&&后面的

式子。如:

main()

{inta=5,b=8;ab结果

while(++a>7&&-b<7)

77

printf(u%d,%d\n,,,a,b);

86

printf(u%d,%d\n,9,a,b);

84

|

5、break;:①用于结束整个循环,

②它只能跳出其所在的循环不能跳出外层循环,

③只能用于循环和switch语句。

6、continue;:用于结束本次循环,开始下一次循环。

7、程序举例:

1)判断一个数是否为素数,输出100〜200之间所有素数的个数;(例5.7,5.8)

2)计算II的值(见例5.4,plOO)

3)计算级数的值(见习题5-8,P113)

4)求阶乘n!。

第六章:数组

数组

一、一维数组

1、定义、意义

格式:数据类型数组名[整型数];

如:inta[10];

意义:定义了10个变量(元素),每个变量存放一个整数。

a[0]、a[l],a[2]、a[3],a[4],a[5]、a[6],a[7]>a[8]、a[9]

说明:下标从0开始,定义时的下标可以是整型数、整型数的表达式或符号常量。

不能使用变量。

如:#defineN10

inta[10],score[N],b[4+6];

2、赋值:

1)直接赋值:a[0]=6;a[l]=5,a[2]=a[0]+a[l];

2)定义时赋值

inta[10]={7,5,3,8,9,l,2,10,6,4};

floatb[20]={6.5,8.9,4.6};

注意:A)定义时不赋初值,所有元素的值不确定。赋值一部分,其余元素值为

0或,\0二

B)可以省略下标inta[]={7,5,3,8,9,1,2,10,6,4);

C)赋值个数不能多于下标数,否则系统会报错。

D)不能inta[10]={};或inta[10]={7,5,,,9,1,2);

3)键盘赋值:scanf("%d”,&a[O]);(可用循环对所有元素赋值)

3^输出:数值数组,必须一个个单独输出。如printf("%d”,a[O]);

4、数组的存储:按元素的先后顺序存储。数组名表示首地址,是常量,定义后不能赋

值。

5、注意区别:定义时赋值与非定义时赋值。

如:inta[10]={7,5,3,8,9,l,2,10,6,4};

a[10]={7,5,3,8,9,l,2,10,6,4};(错误!!)

6、例题:

1)找出下列数据的最小值输出(用三种方法编程)。

32596471081

2)输入10个整数,找出它们的最小值,输出最小值和位置。

3)从键盘输入10个整数,输出它们并计算它们的平均值。

4)从键盘输入10个整数,存入一个数组中,然后对其数据倒置并输出。

5)对下列数据按从小到大排序输出。(分别用选择排序、冒泡排序、直接交换排序编程)

3,8,5,9,6,2,10,7,1,4

二、字符数组

1、字符数组的作用:用于存放字符串(string)。字符串是用双引号括起来的一串字符,

后面自动加,MT,如“ABCDE"、"Student"、"Thisisamap”

2、字符数组的定义、意义

格式:数据类型数组名[整型数];

如:chars[10];

意义:定义了10个变量(元素),每个变量存放一个字符。

s[0]>s[l],s[2]、s[3],s[4]、s[5],s[6]、s[7],s[8]、s[9]

3、赋值:

1)直接赋值:s[0尸A,;s[l]=,m,,s[2]=7;

2)定义时赋值

chars[10]={'A','B','C','D','E','F','G','H',T,'',''0'};/*需手工加'\0'*/

chars[10|={,,ABCDEFGHr,);

chars[10]=,,ABCDEFGHr,;

注意:定义时不赋初值,所有元素的值不确定。赋值一部分,其余元素值为0

或'\0'。

3)键盘赋值:

scanf("%c”,&s[0]);/*可用循环对所有元素赋值。可以接收任意字符*/

scanf("%s”,s);/*后面只写数组名,输入时以空格、回车、Tab键作结束,

字符串自动加'\0'*/

gets(s);/*输入时以回车键作结束,字符串自动加,\0力

strcpy(s,,,ABCDE,,)5

4、输出:

printf(M%cM,s[i]);/*用循环一个个输出*/

printf("%s”,s);/*整体输出,后面写数组名,遇,\0,则结束*/

puts(s);/*整体输出,后面写数组名,遇、(F则结束,输出完后换行*/

5、数组的存储:按元素的先后顺序存储。数组名表示首地址,是常量,定义后不能赋

值。

6、字符串的处理:从前到后一个个看一遍。

7,例题

1)输入一个字符串,然后输出。(用三种方法输入输出“ABCDEFGIHJ”)

2)输入一句英文,统计出英文字符的个数

3)输入一段文字,将其中的小写字母转换为大写,然后输出。

4)输入一行字符,统计其中字母、数字和其他字符的个数。

5)输入一行字符串,把它复制到另一个字符数组中

6)输入两个字符存入S、t数组中,把t连接到s后面

三、字符串处理函数

1、输入一个字符

格式:c=getcher()scanf("%c",&c);相同

功能:从键盘接收一个字符存到变量C中。可以接收任意字符。

2、输出一个字符

格式:putchar(c)

功能:把C中的字符显示到屏幕上。

如:这putchar('A');charc='A';putchar(c);

3、输入一个字符串

格式:gets(s);

功能:接收一个字符串存入数组s中。输入时以回车键作结束,字符串后自动加、(F

4、输出一个字符串

格式:puts(s);

功能:把数组s中的字符串输出到屏幕上,遇、(T则结束,输出完后换行。

5、求字符串长度

格式:strlen(s)

功能:返回字符串所含字符个数(长度),、(r不记。

如:chars[50]="ABCDEF”;

strlen(s)结果为:6

strlen(wThisisamap!^^)结果为:14

6、字符串的复制

格式:strcpy(s,t);

功能:把数组t(源)中的字符串复制到s(目标)中。

如:chars[20],t[20]="ABCDE”

strcpy(s,t);

strcpy(s,"student");

说明:源二定是字符串变量,目标可以是字符串变量,也可以字符串常量。

7,字符串连接

格式:strcat(s,t)

功能:把字符串t连接到字符串s之后。

如:chars[50]="abcde”,t[20]=”ml23”

strcat(s,t)结果:^^abcdeml23^^

strcat(s,"xyz")结果:^^abcdexyz^^

说明:源一定是字符串变量,目标可以是字符串变量,也可以字符串常量。

8、字符串比较

格式:strcmp(s,t)

功能:对s、t中字符一个个比较,s大则返回正整数n,s小则返回负整数n,相等则返

回0.

如:strcmpdabcP-abcdefg");结果2

strcmp("abcd","abcdefg");结果-101

strcmp("ABCDE”,”ABCDE”);结果0

说明:两个字符串都可以是字符串变量,也可以字符串常量。

9、说明:

getcher。、putchar(c)、gets(s)、puts(s)包含在stdio.h中。

strlen(s)、strcpy(s,t)、strcat(s,t)>strcmp(s,t)包含在string.h中

10、例:

任意输入两个字符串,把大的存入a中,小的存入b中然后输出。

四、二维数组

1、定义、意义

格式:数据类型数组名

如:inta[3][4];

意义:定义了3行4列3*4个变量(元素),每个变量存放一个整数。

a[0][0],a[0][1]>a[0][2],a[0][3]

a[l][0],a[l][1],a[l][2],a[l][3]

a[2][0]>a[2][1],a[2][2]>a[2][3]

2、赋值:

1)直接赋值:a[0][0]=6;a[0][l]=5;

2)定义时赋值

inta[3][4]={l,2,3,4,5,6,7,8,9,10,H,12);

inta[3][4]={{l,2,3,4},{5,6,7,8},{9,10,ll,12});

inta[][4]={{l,2,3},{5,6},(9»;

注意:A)定义时不赋初值,所有元素的值不确定。赋值一部分,其余元素值为

0或'\(『。

B)可以省略第一个下标inta[][4]={1,2,3,4,5,6,7,8,9,10};

3)键盘赋值:scanf("%d”,&a[0][0]);(只能一个个输入,可用双循环对所有元素赋

值)

3、输出:数值数组,必须一个个单独输出,可用双循环输出所有元素。

如printf(“%d”,a[0][0]);

4、数组的存储:按行顺序存储。数组名表示首地址,是常量,定义后不能赋值。

如:main()

{inta[3][4]={l,2,3,4,5,6,7,8,9,10,ll,12},ij;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

printf("%d",a[i]U]);

printf("\n%u",a);

5、例

1)编程:求5行5列矩阵对角线元素之和。

2)编程:对4行4列矩阵转置。

3)某班有30人,有四门课程语文、数学、英语、专业课。编程输入各人的成绩,求

各人的总分、平均分及各科科平分。

五、二维字符数组

1、定义、意义

格式:数据类型数组名

如:chars[3][10];

意义:定义了3行10列3*10个变量(元素),每个变量存放一个字符。

每行存放一个字符串,存到s[0]、s[l],s[2]中

s[0]s[0][0],s[0][1],s[0][2],s[0][3]……s[0][9]

s[l]s[l][0bs[l][l]^s[l][2],s|l||3|……s|l||9|

s[2]s[2][0]ss[2][1]>s[2][2].s[2][3]……s[2][9]

2、赋值:

1)直接赋值:s[0][0]=,A,;s[0][l]=B;

2)定义时赋值

ints[3]|10|={<A,,,B,,,C,,,\0,};

ints[3][10]={“ABC”,“XYZ”,”MNOPQ”};

ints[][10]={“chism”,"change”,"chank","char",”check");

3)键盘赋值:

一次输入一个字符:scanf(“%c”,&s[0][0]);

s[0][0]=getchar();

一次输入一^个字符串:scanf("%s",s[0]);

gets(s[0]);

3、输出:

一次输出一个字符:printf(«%cw,s[0][0]);

putchar(s[0][0]);

一次输出一个字符串:printf(tt%sM,s|0]);

puts(s[0]);

4、例

1)输入下列五个字符串,从小到大排序输出

“chism","change”,"chank”,“char”Jcheck”

第七章函数

1、函数的定义

1)函数的定义格式

类型函数名(形参列表)/*函数首部*/

{语句组;/*函数体*/

return式子;

)

2)类型:指函数返回值的类型,可以是int、float,char、long、void、…

其中int型可以省略。

3)形参列表:是子函数要从主调函数接收数据的变量(等同于赋值的左边),每个形

参要说明其类型,且用“,“分隔。可以没有形参。

4)函数体:用于完成相应的功能。

2、函数的调用:

1)格式:函数名(实际参数);

2)说明:实际参数是主函数要传递到子函数的数据,等同于赋值的右边,可以是数、

变量、式子。

3)调用形式:

①函数作为单独一行语句进行调用mj(a,b);

printf(…);

②函数作为表达式的部分使用x=mj(a,b);

n=sqrt(x);

③函数作为另一个函数的参数进行调用:printf("%f\n”,mj(a,b));

printf("%f\n",sqrt(x));

3、函数的返回:函数返回可以使用return返回,也可以执行到函数尾自动返回调用函数。

函数无返回值时,须将函数定义为void型。

4、函数的说明:

A)一般地,子函数应写在前面,主函数写在后面。如果函数定义在调用之后,则应先

进行说明,才能正确调用。

B)说明方法:与定义时的函数首部相似,加分号,可以省略形参。int型函数可以不说

明。如floatmj(floata,float*b);

或floatmj(float,float*);

。说明位置:在函数内部或外部。

5、函数的运行过程:

运行主函数前部一调用子函数f运行子函数一返回主函数一运行主函数后部

6、函数的参数传递(特别注意主函数与子函数中的变量同名一同意的情况)

1)赋值调用:赋值调用时,函数将实参的值复制一份传递给形参,只进行单向传递。

实参可以是常量、变量、表达式。

2)传址调用:传址调用的函数,主调函数把变量的地址传到子函数中,调用语句采用

swap(&a,&b)传递内存地址。子函数的参数一般为指针型,如swap(int*a,int*b)

7,数组的调用

1)一维数组如inta[10]={1,2,3,4,5,6,7,8,9,10};

①调用时一般传递数组名和数组大小到子函数,如fun(a,10);

②子函数首部形式:fun(inta|],intn)或fun(int*a,intn);

不论哪种形式,都是子函数用指针指向主函数的首地址。

2)二维数组ft!inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

①调用时一般传递数组名和行数到子函数,如fun(a,3);

②子函数首部形式:fun(inta[][4],intn)或fun(int(*a)[4],intn);

3)字符串数组,一般只传递数组名。

8、函数的嵌套

1)意义:在一个函数中调用另一个函数,叫函数的嵌套

如main。调用a()函数,a()函数调用b()函数,b()函数调用c。函数….

2)函数的递归调用:

函数自身调用自身,即main。调用a()函数,a()函数再调用a()函数,….

9、局部变量和全局变量

1)局部变量:在函数内定义或函数块内定义,只在函数内或块内有效,当退出函数或块

内时自动释放。定义后初值不定。

2)全局变量:定义在函数外,从变量定义开始,到程序文件结束,变量一直有效。初值

为0

3)分析下列程序的运行结果

练习1练习2

intm=13;main()

intfun2(intx,inty){inta=3,b=2,c=l;

{intm=3;c-=++b;

return(x*y-m);b*=a+c;

){intb=5,c=12;

c/=b*2;

main()a-=c;

{inta=7,b=5;printf(w%d,%d,%d,,9,a,b,c);

printf(n%d\nM,fun2(a,b)/m);a+=-c;

))

printf(w%d,%d,%d\n5,,a,b,c);

)

10、变量的存储类型

r-动态存储自动变量:auto

1)变量的存储类型一-寄存器变量:register

匚静态存储

静态变量:static

外部变量:extern

2)特点

名称表示初值函数结束后,其存储空间各自特点

自动变量auto不定自动释放默认为auto变量

存放在cpu寄存器中,cpu

寄存器变量register不定自动释放寄存器

寄存器不够时,转为auto

多次进入,只进行一次定义

静态变量statico或,\(r不释放

和初始化

1)对外部变量进行说明

2)后面定义的变量提前使用

外部变量externo或,\(r不释放

3)多个程序文件之间变量的

引用

11.程序举例

P184-185:习题1、3、9、11

第八章:指针

一、指针的基本知识

引例:inta,b,x[10]={l,2,3,4,5,6,7,8,9,10},*p,*q;

通过下列程序可以看到各变量的名称、内容、地址。

#include<graphics.h>

#defineN10

main()

{intx=100,y=200,a[N]={l,2,3,4,5,6,7,8,9,10},*p=&a,*q=x,i;

printf(n\n\n\n\n\n\n\n\n\ii\n\n\n\n\n\iixy");/*显示x、y的名称

for(i=0;i<N;i++)/*显示数组元素的名称*/

printf(Ma[%d]H,i);

printf(u\n%6d%6d,\x,y);/*显示x、y的内容*/

for(i=0;i<N;i++)/*显示数组元素的内容刃

printf(H%6dH,a[i]);

printfr'\n%6u%6un,&x,&y);/*显示x、y的地址*/

for(i=0;i<N;i++)信显示数组元素的名称*/

printf(M%6uH,&a[i]);

1、指针变量:定义时带*号的变量,它用于存放变量地址,这种变量称为指针变量

指针变量存放哪个变量的地址,我们就说它指向哪个变量。

2、指针的定义方式和意义

类型*变量名;

如:inta=5,b=10,*p=&a,*q=&b;

floatm,n,*x;

chars[10]="ABCD”产ch;

int*p⑸;意义是:

int(*p)[5];意义是:

int**pl;意义是:

一个指针变量有六个属性:

指针变量名称、类型、内容、地址、存储类型、指针变量指向的内容。

3、指针的赋值(赋值后要能画指向图)

1)把一个变量的地址赋给指针变量。如:inta,*p;p=&a;

2)数组名赋给指针变量:floata[10],*x,;x=a;

3)一个指针变量赋给另一个指针变量。如:inta=10,*p=&a,*q;q=p;

4)赋空值:(0、9\0\NULL)如:char*c;c=NULL;

5)赋值的形式有:定义时赋值inta,*p=&a;

定义后赋值p=&a;

6)注意:指针变量的值只能是内存中的一个地址,不能用数值或表达式给指针变量赋

值。指针变量只能存放同类型变量的地址。

如:int*p;

p=1000;p=400+1500;(错)

charc;p=&c;(错)

4、指针的引用:用取值运算符来存、取指向的变量的值。

如:*p=5;*x=45.65;

b=*p+*x;printf(u%d%d\n”,*p,*x);

5、说明:

1)注意区别定义时的*p和引用时的*p。

如int*a;

*a=8;

2)一个任何类型的指针变量,占用存储空间2个字节。(因为内存地址只有0〜65535)

6、例从键盘输入两个整数,用交换它们的值后输出。

二、指针与数组(把数组的首地址或某元素的地址给指针后,指针与数组则建立了联系)

1、一维数组:如inta[10]={2,4,6,8,10,12,14,16,18,20},*p=a;

内容:a[0]~a[9]xp[0]~p[9]

*a、*(a+0)〜*(a+9)、*(p+0)-*(p+9)

地址:&a[0]〜&a[9]、&p[0]-&p[9]

a^(a+0)〜(a+9)、p、(p+0)〜(p+9)

2、指针的运算(指针运算前,必须先将指针指向一个数组)

指针加(减)一个整数,结果是指向该数组的另一个元素。

指针自增(自减),结果是指向该数组的下(上)一个元素。

两个指针相减,结果是相距的元素个数。

3、二维数组与指针:

1)二维数组转化为一维指针。

如inta[3][4]={2,4,6,8,10,12,14,16,18,20,22,24},*p=a;

内容:a[0][0]~a[2][3]>p[O]~p[ll]

**a、*(*(a+0)+0)-*(*(a+2)+3)、*p、*(p+0)〜*(p+ll)、*(a[i]+j)>*(a+i)[j]o

如:a[l]⑵可以表示为:*(p+7)、p[7]、*(*(a+l)+2)、*(a[l]+2)、*(a+l)[2]

地址:&a[0][0]~&a[2][3]>&p[O]~&p[ll]

a>(a+0)〜(a+2)、*a、*(a+0)+0〜*(a+2)+3>p>(p+0)-(p+11)

2)二维数组a[n][m]转化为二维指针:建立一个行指针(*p)[m]

3)二维数组a[nHm]转化为二维指针:建立一个指针数组*p[n]

已知inta[4][5]={l,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)

数组a[n][m]一维指针p行指针(*q)[m]数组指针*r[n]

inta[n][m],*p,(*q)[m],*r[n];

赋值P=a;q=aka(赋值错误)

r[0]=a[0]

a[l][2]P(6]q⑴⑵r[l][2]

*(a[l]+2)*(p+6)*(q[l]+2)*(r[l]+2)

(*(a+l))[2](*(q+l))[2](*(r+l))[2]

*(*(a+l)+2)*(*(q+l)+2)*(*(r+l)+2)

4、例题:

例1:用多种方法显示一维数组内容(或地址)。(共4种方法)

2,4,6,8,10,12,14,16,18,20

例2:用多种方法显示下列二维数组内容(或地址)。

inta[4][5]={l,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);

main()

{

int*p,(*q)[5],*r[4],ij;

P=a;

q=a;

for(i=0;i<4;i++)/*不能用r=a赋值*/

r[i]=a[i];〃行地址

for(i=0;i<4;i++)

{for(j=0;j<5;j++)

printf(M%4dn,(*(a+i))[j]);/*注意(*(a+i))的外括号不能少*/

printf(n\nn);

例3:intid,a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24},*p=a,*q=a+l;

如何显示内容14,如何显示14的地址。

三、字符数组与指针

1、一维字符数组与指针

1)字符串的两种存储方式及意义:

chara[10],*p=a;采用字符数组方式

char*p=9,Studenr;采用字符指针方式

p=MxyzM

2)字符串数组与字符串指针的区别

(1)字符数组已经事先预备了空间,字符串一定要存入它的空间里,且数组名是常

量。

(2)字符指针不事先预备空间,字符串放在哪里,它就指向哪里,指针名是变量。

注意:如果指针没有指向,则不能一个个赋值。

如:char*p;是错误的。

(3)赋值方法:

定义时赋值chara[10]="abcd'',*b="abcde";

键盘输入赋值gets(a)gets(b)

直接赋值a[0]=,a,;a[l]=,b,;b="xyz”

a="Student";(错误)b="Student";(正确)

2、二维字符数组与指针

1)定义和意义

chars[5][20];

char*p[5];

二维字符数组,第一维表示有多少个字符串,第二维表示每个字符串最多有多少

个字符

字符指针数组,表示多少个指针,每个指针可以指一个字符串。

2)赋值方法:

定义时赋值:chars[5][20]={"abc","mnopq","xyxze","1235","ml235"}

char*p[5]={"abc","mnopq","xyxze","1235","ml235")

键盘输入赋值:scanf("%s",s[i]);

scanf("%s",p[i]);

直接赋值:s[0][0]=W;

p[0]="abcdef";

3、注意区别数值数组和字符数组,

1)数值数组名只表示首地址,字符数组名表示首地址,同时也表示整个字符串。

inta[]={l,2,3,…};charb[]=wThisw;

printf("%d\n%s”,a,b);(a的使用错误)

2)在定义并赋初值时不同

inta[10]={l,2,3,…};charb[10]={“Student"},c[]="map”;

3)输入输出时的方式不同。

数值数组只能一个个输入输出,字符数组既可一个个输入输出,也可整体输入输

出。

4)一维字符数组表示一个字符串,二维字符数组表示多个字符串。如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论