




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章常用数据表达
本章重点:
●
常用的数据类型●
宏的定义与应用●
数组的定义和使用●
指针的定义和使用●结构体的定义●
枚举与定义类型●
指针和数组●
返回值为指针的函数●指向函数的指针1第8章常用数据表达本章重点:●枚举与定义类型1基本数据类型类型基本类型
构造类型指针类型空类型整型实型枚举型字符型数组类型结构体类型共用体类型双精度单精度构造类型数据是由基本类型数据按一定规则组成的,所以它们又被称为“导出类型”。2基本数据类型类型基本类型构造类型指针类型空类型整型实型枚举为什么要有数组这么一个数据类型?数组与其他基本的数据类型有什么区别?8.1数组
3为什么要有数组这么一个数据类型?8.1数组3举例:一个班有30个学生,求这30个学生的总成绩和平均成绩。分析:如果按照我们以前的知识,涉及到30个学生的成绩,那么我们要定义30个变量来存储成绩信息。那么如果100个学生呢?是不是要定义100个变量?若有2万在校生,那么学籍管理系统中是不是要定义2万个变量?------不可能!
如何表示这么多学生的相关信息(例如成绩),就要引入数组的概念,数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。可以用一个统一的数组名和下标来惟一的确定数组中的元素,利用循环来统一完成各个元素的各种操作。4举例:一个班有30个学生,求这30个学生的总成绩和平均成绩。数组具有如下主要特点:(1)每个数组中的元素类型必须一致。(2)用不同的下标来区分数组的元素。(3)数组在内存中占有连续的存储单元,数组名表示数组在内存中的首地址。(4)数组和指针有着极密切的联系,可以通过指针移动来对数组元素进行操作。5数组具有如下主要特点:5#include<stdio.h>intmain(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};
/*定义一个整型数组,数组名为a,并给数组初始化*/for(i=0;i<10;i++)printf("a[%d]=%-2d",i,a[i]);
/*a[i]为数组的第i个元素*/printf("\n");return0;}例8.1数组及数组元素的表示方法
。6#include<stdio.h>例8.1数组及数组元素的一、一维数组定义
1.定义形式:
数据类型数组名[元素个数];
如:inta[5];不能写成inta(5);
8.1.1一维数组2.注意:
①数组名由用户定义,规则与变量名相同,②元素个数为常量表达式而不能是变量表达式。如:intn=5;inta[n];③数组的下标从0开始。如:a[10]下标是从0—9,而不是1--10。下标可以是整型常量或整型常量表达式④和其他变量一样,数组也必须先定义后使用。7一、一维数组定义8.1.1一维数组2.注意:二、一维数组的引用、初始化与赋值C语言规定不能一次引用整个数组,引用时只能对逐个元素进行引用。(1)一维数组引用:引用形式:数组名[下标]注意:对下标的使用不要超过下标的最大值。尽管超过最大值时不出现编译错误。但是运行的时候会出现杂乱的结果。例如:a[0]=8;a[2]=0;a[3]=2*a[2];
8二、一维数组的引用、初始化与赋值8(2)一维数组赋值如何给一维数组赋值呢?可以有三种方法:①数组的初始化②程序中赋值③键盘中读入数组的初始化
在定义数组时对数组元素可赋以初值。例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9};
初始化时可以只对一部分元素赋初值。例如:
inta[10]={0,1,2,3,4};
如果想使一个数组的元素值全部为0.例如:
staticinta[10]={0};
在对全部数组元素赋初值时,可以不指定数组长度。例如:inta[]={1,0,3,5,7};
9(2)一维数组赋值9程序中给数组的元素赋值。例8.2程序中给数组的元素赋值,并输出数组元素的值。
#include<stdio.h>intmain(){ints[10]={1,2,3,4,5,6,7,8,9,10};/*定义数组s,并初始化*/inti=2,a[3];/*定义数组a*/a[0]=s[i];/*为数组元素a[0]赋值*/a[1]=s[2+i];a[2]=s[2*i+3];printf("a[0]=%da[1]=%da[2]=%d\n",a[0],a[1],a[2]);return0;}程序执行结果:10程序中给数组的元素赋值。程序执行结果:10程序运行时从键盘输入
例8.3程序运行时从键盘输入,给数组的元素赋值,最后输出数组元素的值。
#include<stdio.h>voidmain(){inti,a[10];printf("请输入10个整型数,以空格隔开\n");for(i=0;i<10;i++)/*输入10个数,分别赋予10个元素*/scanf("%d",&a[i]);printf("输入的数组为:");for(i=0;i<10;i++)/*输入10个元素值*/printf("a[%d]=%-4d",i,a[i]);printf("\n");}11程序运行时从键盘输入例8.3程序运行时从键盘输入,给数组的C语言本身没有字符串类型,字符串的存储完全依赖于字符数组,但字符数组又不等于字符串。虽然C语言中没有字符串数据类型,但却允许使用字符串常量。在C语言中,字符串是借助于字符型一维数组来存放的,以字符‘\0’作为字符串结束标志,它的ASCII代码值为0,‘\0’占用存储空间、不输出,也不计入串的实际长度。用字符数租存放字符串。8.1.2字符数组12C语言本身没有字符串类型,字符串的存储完全依赖于字符数组,但charc[10];c[0]=‘I’;c[1]=‘’;c[2]=‘a’;c[3]=‘m’;c[4]=‘’;c[5]=‘h’;[6]=‘a’;c[7]=‘p’;c[8]=‘p’;c[9]=‘y’;字符数组的定义 字符数组的定义方法与普通的数组的定义方法类似。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]Iamhappy13charc[10];字符数组的定义a[0]a[1]字符数组的输入输出有下列方法:(1)逐个字符输入输出。用格式符"%c"输入或输出一个字符。(2)将整个字符串一次输入或输出。用格式符“%s”,对字符串进行输入输出。(3)用gets()输入字符串,用puts()输出字符串。14字符数组的输入输出有下列方法:14例8.4利用字符数组,在终端中输出字符串“ILoveChina!”。分析:初始化数组string[],在初始化时直接用字符串常量,给字符数组string[]赋值。#include<stdio.h>intmain(){charstring[]=“ILoveChina!”;/*定义数组并初始化*/printf(“%s\n”,string);/*字符串输出*/return0;}程序执行结果:15例8.4利用字符数组,在终端中输出字符串“ILove例8.5输入一行字符,统计其中字母、数字、空格和其它字符的个数,并输出结果。分析:用函数gets()输入字符串,字符个数小于等于80(因为数组长度为80)。用gets()函数输入字符,可以输入空格,若用scanf()函数输入字符,遇到空格时系统认为字符串结束。设整型变量letter,digit,space,other分别存放字母、数字、空格和其他字符的个数,其初始值均为0。在循环中判断数组中的每个字符是字母(则letter++)?还是数字(则digit++)?还是空格(则space++)?还是其他字符(则other++)?16例8.5输入一行字符,统计其中字母、数字、空格和其它字符的#include<stdio.h>voidmain(){charstr[80];intletter=0,digit=0,space=0,other=0,i,length=0;
gets(str);
/*输入若干字符*/
for(i=0;str[i]!='\0';i++)/*判断字符是什么*/{if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z') letter++; else if(str[i]>='0'&&str[i]<='9')digit++; else if(str[i]=='')space++; elseother++;}printf("letter:%ddigit:%dspace:%dother:%d\n",letter,digit,space,other);}17#include<stdio.h>178.1.3二维数组在C语言中,可以把二维数组看作是一种特殊的一维数组。二维数组中元素的排列顺序是:先按行存放,再按列存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
188.1.3二维数组在C语言中,可以把二维数组看一、二维数组的定义定义格式:类型数组名[行数][列数];(1)如:inta[2][3];(2)在内存中,是按行存放的。(3)因为数组的存储是顺序的,所以,各个元素的存储顺序为:
a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]255914218300行:
a[0][0]a[0][1]a[0][2]1行:
a[1][0]a[1][1]a[1][2]19一、二维数组的定义255914218300行:三、二维数组元素的初始化
1.按行给二维数组赋初值。如:intaa[2][3]={{0,0,1},{1,0,0}};2.也可以把数值写在一块:intaa[2][3]={0,0,1,1,0,0}则aa[0][0]=0aa[0][1]=0aa[0][2]=1aa[1][0]=1aa[1][1]=0aa[1][2]=0
二、二维数组元素的引用行号和列号都是从0开始的,并注意行号和列号不要超过数组定义的范围。20三、二维数组元素的初始化1.按行给二维数组赋初值。3.如果初始化值比数组元素少,则后面的元素值为0,如:inta[4][5]={{1,2},{},{0,1,3}}则各值为: 1200000000 01300 000004.可以对单个元素进行赋值:aa[3][4]=5;213.如果初始化值比数组元素少,则后面的元素值为0,215.如果对二维数组的所有元素都赋值,则数组的第一维可以省略。如: intm[][3]={1,2,3,4,5,6,7,8,9};则默认的第一维的值是3又如 intm[][3]={1,2,3,4,5,6,7};则默认的第一维的值也是3;其中 m[2][1]=m[2][2]=0;225.如果对二维数组的所有元素都赋值,则数组的第一维可以省略例8.6二维数组输入、输出的例子。
#include<stdio.h>intmain(){inti,j,a[4][3];printf("请输入12个整型数,以空格隔开\n");for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);printf("输入的数组为:\n");for(i=0;i<4;i++){for(j=0;j<3;j++)printf("a[%d][%d]=%-4d",i,j,a[i][j]);printf("\n");}}23例8.6二维数组输入、输出的例子。#include<st例8.7二维数组程序举例对以下矩阵进行转置:2341591356782671410111237111513141516481216
说明:该矩阵是对称矩阵,主对角线上下元素可以直接交换。若是非对称矩阵,可以利用两个二维数组进行存储原矩阵和转置矩阵。24例8.7二维数组程序举例对以下矩阵进行转置:24#include<stdio.h>voidmain(){inti,j,t;inta[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};printf("矩阵转置前:\n");for(i=0;i<4;i++)/*输出矩阵*/{ for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n");}printf("\n矩阵转置后:\n\n");for(i=0;i<4;i++)/*矩阵转置*/ for(j=0;j<4;j++) if(i<=j){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}/*交换元素*/for(i=0;i<4;i++)/*输出矩阵*/{ for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n");}}25#include<stdio.h>258.3指针指针C语言的特色,指针用来存放内存地址,也称为指针变量。利用指针可以存放变量的地址、数组的地址、函数的起始地址等,利用指针可以很方便地处理数组、字符串。计算机的内存是以字节为单位的连续存储空间,每一字节单元都有一个编号,该编号被称为地址,这个地址就像房间号一样。在程序中定义的变量,在内存中都代表某一地址。268.3指针指针C语言的特色,指针用来存放内存地址8.3.1指针变量的定义与赋值(一)指针变量的定义一般形式:类型名*指针变量名;例如:intx,*p1,*p2;
标志命名规则同变量名(二)指针变量的赋值可以初始化:类型名*指针变量名=初值表达式;例如:int*px=&x;也可以赋值,例如:intx,*p1,*p2;p1=&x;278.3.1指针变量的定义与赋值(一)指针变量的定义标志命#include<stdio.h>intmain(){intx;int*p;/*定义一个指针变量p*/p=&x;/*让指针变量p指向x的地址*/scanf("%d",&x);/*键盘中读入赋值给变量x*/printf("x=%d\n",*p);/*输出指针变量p所指的地址上的内容*/return0;}例8.8从键盘输入一个数,赋给一个普通变量,利用指针变量,输出普通变量的值。指针运算符28#include<stdio.h>例8.8从键盘输入一个例8.9指针变量的定义与相关运算示例。
#include<stdio.h>voidmain(){intn=12,*pn;/*定义一个指向int型数据的指针变量pn*/
floatf=3.14,*pf;/*定义一个指向float型数据的指针变量pf*/
charch=’p’,*pc;/*定义一个指向char型数据的指针变量pc*/
pi=&n; /*取变量n的地址,赋值给指针变量pi*/
pf=&f; /*取变量f的地址,赋值给指针变量pf*/
pc=&ch; /*取变量ch的地址,赋值指针变量给pc*/
printf(“n=%d,*pn=%d\n”,n,*pn);
printf(“f=%f,*pf=%f\n”,f,pf);
printf(“ch=%c,*pc=%c\n”,ch,*pc);
}程序运行结果:n=12,*pn=12f=3.14,*pf=3.14ch=p,*pc=p29例8.9指针变量的定义与相关运算示例。
#include<存取变量x值的方式有两种:(1)直接访问──直接利用变量的地址进行存取scanf(“%d”,&x);的执行过程是这样的:用变量名x作为索引值,找到变量x的起始地址;然后将键盘输入的值(假设为3)送到内存单元中。printf(“x=%d\n",x);的执行过程,与scanf()很相似:
首先找到变量x的起始地址,然后从其地址中取出其值,最后将它输出。(2)间接访问──通过另一变量访问该变量的值
C语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它同类型变量的地址。
intx=8,*p1;/*定义变量x,指针变量p1*/
p1=&x;/*指针变量赋值*/printf(“%d,%d”,x,*p1);/*输出*/30存取变量x值的方式有两种:308.3.2指针变量的运算1.取地址运算(&)取地址运算的格式:&变量注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。2.指针运算符(*)也称间接访问运算符。用“*”可以访问指针变量所指向的变量的值。例如:printf(“n=%d,*pi=%d\n”,n,*pi);注意:指针标识符和指针运算符的区别。在定义指针变量时出现的指针变量名前的“*”是一个标志,而在其余场合出现的“*”是运算符。318.3.2指针变量的运算1.取地址运算(&)31例8.10使用指针变量输入2个整数,按升序(从小到大排序)输出。#include<stdio.h>voidmain(){intn1,n2;int*p1=&n1,*p2=&n2,*p;printf(“输入第一个数:”);scanf(“%d”,p1);printf(“输入第二个数:”);scanf(“%d”,p2);printf(“n1=%d,n2=%d\n”,n1,n2);if(*p1>*p2)/*如果n1>n2,则交换指针值*/{p=p1;p1=p2;p2=p;}printf(“min=%d,max=%d\n”,*p1,*p2);} 程序执行结果:输入第一个数:8↙输入第二个数:2↙min=2,max=832例8.10使用指针变量输入2个整数,按升序(从小到大排序)4.指针运算(1)赋值运算例如:intn,*p1,*p2;p1=&n;p2=p1;(2)加或减一个整型数的运算(p1++、p1--、p1+n)p1++;是指p1指向下一个整型变量(3)在一定条件下,两个指针可以相减
当两个指针指向同一数组时,两个指针变量值之差是指两个指针之间的元素个数。(4)在一定条件下,两个指针可以比较当两个指针指向同一数组时,可以进行比较。指向前面元素的指针小于指向后面元素的指针。
若两指针不指向同一数组,则两指针相减或比较均无意义。将一变量的地址赋予指针变量将一指针变量的值赋予另一指针变量334.指针运算将一变量的地址赋予指针变量将一指针变量的值赋予案例8.11指针运算的实例。分析程序输出的结果。#include<stdio.h>inta[]={4,2,7,9,3,5};/*定义全局数组a*/main(){int*pa1,*pa2;pa1=&a[2];pa2=a+5;printf("%d\n",pa1+3==pa2);printf("%d,%d\n",pa2-pa1,(int)pa2-(int)pa1);printf("%d\n",*(++pa1));printf("%d\n",*(--pa2));}/*定义指针变量*//*指针变量赋值,使之指向数组*//*指针变量pa1加3并与pa2比较是否相等*//*指针pa2-pa1*//*指针变量加1,指向后面一个元素*//*指针变量减1,指向前面一个元素*/34案例8.11指针运算的实例。分析程序输出的结果。/*定8.3.3数组与指针(一)指向数组的指针数组的指针──数组在内存中的起始地址数组元素的指针──数组元素在内存中的起始地址。
1.指向数组的指针变量的定义指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如:intarray[10],*pointer;pointer=array;/*或者pointer=&array[0];*/
注意:数组名代表数组在内存中的起始地址(与第1个元素的地址相同),所以可以用数组名给指针变量赋值。358.3.3数组与指针(一)指向数组的指针数组的指针──数2.数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。
intarray[10],*pointer=array;则:(1)pointer+i和array+i都是数组元素array[i]的地址。(2)*(pointer+i)和*(array+i)就是数组元素array[i]。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,pointer[i]等价于*(pointer+i)
注意:pointer+1指向数组的下一个元素,而不是简单地使指针变量pointer的值+1。362.数组元素的引用intarray[10],例8.12使用指向数组的指针变量来引用数组元素。#include<stdio.h>voidmain(){intarray[10],*pointer,i;
pointer=array;printf("Input10numbers:\n");for(i=0;i<10;i++)scanf("%d",pointer+i);/*用指针变量来输入数组元素的值*/printf("array:");for(i=0;i<10;i++)printf("%d",*(pointer+i));/*用指针变量输出数组元素的值*/printf("\n");}
37例8.12使用指向数组的指针变量来引用数组元素。37例8.13改写例8.12用指针输入输出数据。分析下列程序,判断是否有错,若有错,请找出错误原因,并改正。#include<stdio.h>voidmain(){int*p,i,a[10];p=a;/*指针变量p指向数组a*/printf("Input10numbers:");for(i=0;i<10;i++)scanf("%d",p++);printf("\n");
for(i=0;i<10;i++,p++)printf("%d",*p);printf("\n");}38例8.13改写例8.12用指针输入输出数据。分析下列程序字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。(一)字符串的表示与引用在C语言中,既可以用字符数组存放字符串,也可用字符指针变量来指向字符串;引用时,既可以逐个字符引用,也可以整体引用。8.3.4字符串与指针39字符串在内存中的起始地址称为字符串的指针,可以1.逐个引用例8.14使用字符指针变量指向和引用字符串。#include<stdio.h>voidmain(){char*string="IloveBeijing.";
for(;*string!='\0';string++)printf("%c",*string);printf("\n");} 2.整体引用#include<stdio.h>voidmain(){char*string="IloveBeijing.";printf("%s\n",string);}
401.逐个引用2.整体引用403.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者是有区别的,不能混为一谈。(1)存储内容不同字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。(2)赋值方式不同对字符指针变量,可采用下面的赋值语句赋值:
char*pointer;pointer=“Thisisaexample.”;/*合法用法*/而字符数组,虽然可以在定义时初始化,但不能用赋值语句整体赋值。下面的用法是非法的:chararray[20];array=“Thisisaexample.”;/*非法用法*/(3)指针变量的值是可以改变的,字符指针变量也不例外;而数组名代表数组的起始地址,是常量,而常量不能被改变。413.字符指针变量与字符数组之比较41
1.概念
数组的每个元素都是一个指针数据。指针数组比较适合用于指向多个字符串,使字符串处理更加方便、灵活。
2.定义格式
数据类型*数组名[指针元素个数];
例如:int*p[5];char*str[7];
8.3.5指针数组421.概念
数组的每个元素都是一#include<stdio.h>intmain(){char*name[]={"Liu","Fang","Zhang"};inti;for(i=0;i<3;i++)if(name[i][0]=='Z')printf("%s\n",name[i]);return0;}例8.15利用指针数组,根据代表姓名单词的首字母,输出这个姓名.指针数组定义并初始化name[0]Liuname[1]Fangname[2]Zhang43#include<stdio.h>例8.15利用指针数组8.3.6数组指针数组指针用于指向二维数组。数组指针变量定义的一般形式为:
类型说明符(*指针变量名)[下标];例如:inta[2][3],(*p)[3];p=a;用*(p[i]+j)、*(*(p+i)+j)表示数组元素a[i][j]448.3.6数组指针数组指针用于指向二维数组例8.16利用数组指针,输出一个二维数组。#include<stdio.h>intmain(){inta[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};inti,j,(*p)[5];p=a;for(i=0;i<3;i++){ for(j=0;j<5;j++) printf("%d\t",*(*(p+i)+j)); printf("\n");}return0;}45例8.16利用数组指针,输出一个二维数组。#includ作业与实验任务教材P122:一(先完成其中数组的题目,指针的题目以后再做)二(1,2,3)上机完成实验指导书P76:1,2,P85:4了解并掌握一维数组P89:五(1),(2),(3)46作业与实验任务教材P122:一(先完成其中数组的题目,指针第8章常用数据表达
本章重点:
●
常用的数据类型●
宏的定义与应用●
数组的定义和使用●
指针的定义和使用●结构体的定义●
枚举与定义类型●
指针和数组●
返回值为指针的函数●指向函数的指针47第8章常用数据表达本章重点:●枚举与定义类型1基本数据类型类型基本类型
构造类型指针类型空类型整型实型枚举型字符型数组类型结构体类型共用体类型双精度单精度构造类型数据是由基本类型数据按一定规则组成的,所以它们又被称为“导出类型”。48基本数据类型类型基本类型构造类型指针类型空类型整型实型枚举为什么要有数组这么一个数据类型?数组与其他基本的数据类型有什么区别?8.1数组
49为什么要有数组这么一个数据类型?8.1数组3举例:一个班有30个学生,求这30个学生的总成绩和平均成绩。分析:如果按照我们以前的知识,涉及到30个学生的成绩,那么我们要定义30个变量来存储成绩信息。那么如果100个学生呢?是不是要定义100个变量?若有2万在校生,那么学籍管理系统中是不是要定义2万个变量?------不可能!
如何表示这么多学生的相关信息(例如成绩),就要引入数组的概念,数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。可以用一个统一的数组名和下标来惟一的确定数组中的元素,利用循环来统一完成各个元素的各种操作。50举例:一个班有30个学生,求这30个学生的总成绩和平均成绩。数组具有如下主要特点:(1)每个数组中的元素类型必须一致。(2)用不同的下标来区分数组的元素。(3)数组在内存中占有连续的存储单元,数组名表示数组在内存中的首地址。(4)数组和指针有着极密切的联系,可以通过指针移动来对数组元素进行操作。51数组具有如下主要特点:5#include<stdio.h>intmain(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};
/*定义一个整型数组,数组名为a,并给数组初始化*/for(i=0;i<10;i++)printf("a[%d]=%-2d",i,a[i]);
/*a[i]为数组的第i个元素*/printf("\n");return0;}例8.1数组及数组元素的表示方法
。52#include<stdio.h>例8.1数组及数组元素的一、一维数组定义
1.定义形式:
数据类型数组名[元素个数];
如:inta[5];不能写成inta(5);
8.1.1一维数组2.注意:
①数组名由用户定义,规则与变量名相同,②元素个数为常量表达式而不能是变量表达式。如:intn=5;inta[n];③数组的下标从0开始。如:a[10]下标是从0—9,而不是1--10。下标可以是整型常量或整型常量表达式④和其他变量一样,数组也必须先定义后使用。53一、一维数组定义8.1.1一维数组2.注意:二、一维数组的引用、初始化与赋值C语言规定不能一次引用整个数组,引用时只能对逐个元素进行引用。(1)一维数组引用:引用形式:数组名[下标]注意:对下标的使用不要超过下标的最大值。尽管超过最大值时不出现编译错误。但是运行的时候会出现杂乱的结果。例如:a[0]=8;a[2]=0;a[3]=2*a[2];
54二、一维数组的引用、初始化与赋值8(2)一维数组赋值如何给一维数组赋值呢?可以有三种方法:①数组的初始化②程序中赋值③键盘中读入数组的初始化
在定义数组时对数组元素可赋以初值。例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9};
初始化时可以只对一部分元素赋初值。例如:
inta[10]={0,1,2,3,4};
如果想使一个数组的元素值全部为0.例如:
staticinta[10]={0};
在对全部数组元素赋初值时,可以不指定数组长度。例如:inta[]={1,0,3,5,7};
55(2)一维数组赋值9程序中给数组的元素赋值。例8.2程序中给数组的元素赋值,并输出数组元素的值。
#include<stdio.h>intmain(){ints[10]={1,2,3,4,5,6,7,8,9,10};/*定义数组s,并初始化*/inti=2,a[3];/*定义数组a*/a[0]=s[i];/*为数组元素a[0]赋值*/a[1]=s[2+i];a[2]=s[2*i+3];printf("a[0]=%da[1]=%da[2]=%d\n",a[0],a[1],a[2]);return0;}程序执行结果:56程序中给数组的元素赋值。程序执行结果:10程序运行时从键盘输入
例8.3程序运行时从键盘输入,给数组的元素赋值,最后输出数组元素的值。
#include<stdio.h>voidmain(){inti,a[10];printf("请输入10个整型数,以空格隔开\n");for(i=0;i<10;i++)/*输入10个数,分别赋予10个元素*/scanf("%d",&a[i]);printf("输入的数组为:");for(i=0;i<10;i++)/*输入10个元素值*/printf("a[%d]=%-4d",i,a[i]);printf("\n");}57程序运行时从键盘输入例8.3程序运行时从键盘输入,给数组的C语言本身没有字符串类型,字符串的存储完全依赖于字符数组,但字符数组又不等于字符串。虽然C语言中没有字符串数据类型,但却允许使用字符串常量。在C语言中,字符串是借助于字符型一维数组来存放的,以字符‘\0’作为字符串结束标志,它的ASCII代码值为0,‘\0’占用存储空间、不输出,也不计入串的实际长度。用字符数租存放字符串。8.1.2字符数组58C语言本身没有字符串类型,字符串的存储完全依赖于字符数组,但charc[10];c[0]=‘I’;c[1]=‘’;c[2]=‘a’;c[3]=‘m’;c[4]=‘’;c[5]=‘h’;[6]=‘a’;c[7]=‘p’;c[8]=‘p’;c[9]=‘y’;字符数组的定义 字符数组的定义方法与普通的数组的定义方法类似。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]Iamhappy59charc[10];字符数组的定义a[0]a[1]字符数组的输入输出有下列方法:(1)逐个字符输入输出。用格式符"%c"输入或输出一个字符。(2)将整个字符串一次输入或输出。用格式符“%s”,对字符串进行输入输出。(3)用gets()输入字符串,用puts()输出字符串。60字符数组的输入输出有下列方法:14例8.4利用字符数组,在终端中输出字符串“ILoveChina!”。分析:初始化数组string[],在初始化时直接用字符串常量,给字符数组string[]赋值。#include<stdio.h>intmain(){charstring[]=“ILoveChina!”;/*定义数组并初始化*/printf(“%s\n”,string);/*字符串输出*/return0;}程序执行结果:61例8.4利用字符数组,在终端中输出字符串“ILove例8.5输入一行字符,统计其中字母、数字、空格和其它字符的个数,并输出结果。分析:用函数gets()输入字符串,字符个数小于等于80(因为数组长度为80)。用gets()函数输入字符,可以输入空格,若用scanf()函数输入字符,遇到空格时系统认为字符串结束。设整型变量letter,digit,space,other分别存放字母、数字、空格和其他字符的个数,其初始值均为0。在循环中判断数组中的每个字符是字母(则letter++)?还是数字(则digit++)?还是空格(则space++)?还是其他字符(则other++)?62例8.5输入一行字符,统计其中字母、数字、空格和其它字符的#include<stdio.h>voidmain(){charstr[80];intletter=0,digit=0,space=0,other=0,i,length=0;
gets(str);
/*输入若干字符*/
for(i=0;str[i]!='\0';i++)/*判断字符是什么*/{if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z') letter++; else if(str[i]>='0'&&str[i]<='9')digit++; else if(str[i]=='')space++; elseother++;}printf("letter:%ddigit:%dspace:%dother:%d\n",letter,digit,space,other);}63#include<stdio.h>178.1.3二维数组在C语言中,可以把二维数组看作是一种特殊的一维数组。二维数组中元素的排列顺序是:先按行存放,再按列存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
648.1.3二维数组在C语言中,可以把二维数组看一、二维数组的定义定义格式:类型数组名[行数][列数];(1)如:inta[2][3];(2)在内存中,是按行存放的。(3)因为数组的存储是顺序的,所以,各个元素的存储顺序为:
a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]255914218300行:
a[0][0]a[0][1]a[0][2]1行:
a[1][0]a[1][1]a[1][2]65一、二维数组的定义255914218300行:三、二维数组元素的初始化
1.按行给二维数组赋初值。如:intaa[2][3]={{0,0,1},{1,0,0}};2.也可以把数值写在一块:intaa[2][3]={0,0,1,1,0,0}则aa[0][0]=0aa[0][1]=0aa[0][2]=1aa[1][0]=1aa[1][1]=0aa[1][2]=0
二、二维数组元素的引用行号和列号都是从0开始的,并注意行号和列号不要超过数组定义的范围。66三、二维数组元素的初始化1.按行给二维数组赋初值。3.如果初始化值比数组元素少,则后面的元素值为0,如:inta[4][5]={{1,2},{},{0,1,3}}则各值为: 1200000000 01300 000004.可以对单个元素进行赋值:aa[3][4]=5;673.如果初始化值比数组元素少,则后面的元素值为0,215.如果对二维数组的所有元素都赋值,则数组的第一维可以省略。如: intm[][3]={1,2,3,4,5,6,7,8,9};则默认的第一维的值是3又如 intm[][3]={1,2,3,4,5,6,7};则默认的第一维的值也是3;其中 m[2][1]=m[2][2]=0;685.如果对二维数组的所有元素都赋值,则数组的第一维可以省略例8.6二维数组输入、输出的例子。
#include<stdio.h>intmain(){inti,j,a[4][3];printf("请输入12个整型数,以空格隔开\n");for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);printf("输入的数组为:\n");for(i=0;i<4;i++){for(j=0;j<3;j++)printf("a[%d][%d]=%-4d",i,j,a[i][j]);printf("\n");}}69例8.6二维数组输入、输出的例子。#include<st例8.7二维数组程序举例对以下矩阵进行转置:2341591356782671410111237111513141516481216
说明:该矩阵是对称矩阵,主对角线上下元素可以直接交换。若是非对称矩阵,可以利用两个二维数组进行存储原矩阵和转置矩阵。70例8.7二维数组程序举例对以下矩阵进行转置:24#include<stdio.h>voidmain(){inti,j,t;inta[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};printf("矩阵转置前:\n");for(i=0;i<4;i++)/*输出矩阵*/{ for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n");}printf("\n矩阵转置后:\n\n");for(i=0;i<4;i++)/*矩阵转置*/ for(j=0;j<4;j++) if(i<=j){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}/*交换元素*/for(i=0;i<4;i++)/*输出矩阵*/{ for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n");}}71#include<stdio.h>258.3指针指针C语言的特色,指针用来存放内存地址,也称为指针变量。利用指针可以存放变量的地址、数组的地址、函数的起始地址等,利用指针可以很方便地处理数组、字符串。计算机的内存是以字节为单位的连续存储空间,每一字节单元都有一个编号,该编号被称为地址,这个地址就像房间号一样。在程序中定义的变量,在内存中都代表某一地址。728.3指针指针C语言的特色,指针用来存放内存地址8.3.1指针变量的定义与赋值(一)指针变量的定义一般形式:类型名*指针变量名;例如:intx,*p1,*p2;
标志命名规则同变量名(二)指针变量的赋值可以初始化:类型名*指针变量名=初值表达式;例如:int*px=&x;也可以赋值,例如:intx,*p1,*p2;p1=&x;738.3.1指针变量的定义与赋值(一)指针变量的定义标志命#include<stdio.h>intmain(){intx;int*p;/*定义一个指针变量p*/p=&x;/*让指针变量p指向x的地址*/scanf("%d",&x);/*键盘中读入赋值给变量x*/printf("x=%d\n",*p);/*输出指针变量p所指的地址上的内容*/return0;}例8.8从键盘输入一个数,赋给一个普通变量,利用指针变量,输出普通变量的值。指针运算符74#include<stdio.h>例8.8从键盘输入一个例8.9指针变量的定义与相关运算示例。
#include<stdio.h>voidmain(){intn=12,*pn;/*定义一个指向int型数据的指针变量pn*/
floatf=3.14,*pf;/*定义一个指向float型数据的指针变量pf*/
charch=’p’,*pc;/*定义一个指向char型数据的指针变量pc*/
pi=&n; /*取变量n的地址,赋值给指针变量pi*/
pf=&f; /*取变量f的地址,赋值给指针变量pf*/
pc=&ch; /*取变量ch的地址,赋值指针变量给pc*/
printf(“n=%d,*pn=%d\n”,n,*pn);
printf(“f=%f,*pf=%f\n”,f,pf);
printf(“ch=%c,*pc=%c\n”,ch,*pc);
}程序运行结果:n=12,*pn=12f=3.14,*pf=3.14ch=p,*pc=p75例8.9指针变量的定义与相关运算示例。
#include<存取变量x值的方式有两种:(1)直接访问──直接利用变量的地址进行存取scanf(“%d”,&x);的执行过程是这样的:用变量名x作为索引值,找到变量x的起始地址;然后将键盘输入的值(假设为3)送到内存单元中。printf(“x=%d\n",x);的执行过程,与scanf()很相似:
首先找到变量x的起始地址,然后从其地址中取出其值,最后将它输出。(2)间接访问──通过另一变量访问该变量的值
C语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它同类型变量的地址。
intx=8,*p1;/*定义变量x,指针变量p1*/
p1=&x;/*指针变量赋值*/printf(“%d,%d”,x,*p1);/*输出*/76存取变量x值的方式有两种:308.3.2指针变量的运算1.取地址运算(&)取地址运算的格式:&变量注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。2.指针运算符(*)也称间接访问运算符。用“*”可以访问指针变量所指向的变量的值。例如:printf(“n=%d,*pi=%d\n”,n,*pi);注意:指针标识符和指针运算符的区别。在定义指针变量时出现的指针变量名前的“*”是一个标志,而在其余场合出现的“*”是运算符。778.3.2指针变量的运算1.取地址运算(&)31例8.10使用指针变量输入2个整数,按升序(从小到大排序)输出。#include<stdio.h>voidmain(){intn1,n2;int*p1=&n1,*p2=&n2,*p;printf(“输入第一个数:”);scanf(“%d”,p1);printf(“输入第二个数:”);scanf(“%d”,p2);printf(“n1=%d,n2=%d\n”,n1,n2);if(*p1>*p2)/*如果n1>n2,则交换指针值*/{p=p1;p1=p2;p2=p;}printf(“min=%d,max=%d\n”,*p1,*p2);} 程序执行结果:输入第一个数:8↙输入第二个数:2↙min=2,max=878例8.10使用指针变量输入2个整数,按升序(从小到大排序)4.指针运算(1)赋值运算例如:intn,*p1,*p2;p1=&n;p2=p1;(2)加或减一个整型数的运算(p1++、p1--、p1+n)p1++;是指p1指向下一个整型变量(3)在一定条件下,两个指针可以相减
当两个指针指向同一数组时,两个指针变量值之差是指两个指针之间的元素个数。(4)在一定条件下,两个指针可以比较当两个指针指向同一数组时,可以进行比较。指向前面元素的指针小于指向后面元素的指针。
若两指针不指向同一数组,则两指针相减或比较均无意义。将一变量的地址赋予指针变量将一指针变量的值赋予另一指针变量794.指针运算将一变量的地址赋予指针变量将一指针变量的值赋予案例8.11指针运算的实例。分析程序输出的结果。#include<stdio.h>inta[]={4,2,7,9,3,5};/*定义全局数组a*/main(){int*pa1,*pa2;pa1=&a[2];pa2=a+5;printf("%d\n",pa1+3==pa2);printf("%d,%d\n",pa2-pa1,(int)pa2-(int)pa1);printf("%d\n",*(++pa1));printf("%d\n",*(--pa2));}/*定义指针变量*//*指针变量赋值,使之指向数组*//*指针变量pa1加3并与pa2比较是否相等*//*指针pa2-pa1*//*指针变量加1,指向后面一个元素*//*指针变量减1,指向前面一个元素*/80案例8.11指针运算的实例。分析程序输出的结果。/*定8.3.3数组与指针(一)指向数组的指针数组的指针──数组在内存中的起始地址数组元素的指针──数组元素在内存中的起始地址。
1.指向数组的指针变量的定义指向数组的指针变量的定义,与指向普通变量的指针变量的定义方法一样。例如:intarray[10],*pointer;pointer=array;/*或者pointer=&array[0];*/
注意:数组名代表数组在内存中的起始地址(与第1个元素的地址相同),所以可以用数组名给指针变量赋值。818.3.3数组与指针(一)指向数组的指针数组的指针──数2.数组元素的引用数组元素的引用,既可用下标法,也可用指针法。使用下标法,直观;而使用指针法,能使目标程序占用内存少、运行速度快。
intarray[10],*pointer=array;则:(1)pointer+i和array+i都是数组元素array[i]的地址。(2)*(pointer+i)和*(array+i)就是数组元素array[i]。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,pointer[i]等价于*(pointer+i)
注意:pointer+1指向数组的下一个元素,而不是简单地使指针变量pointer的值+1。822.数组元素的引用intarray[10],例8.12使用指向数组的指针变量来引用数组元素。#include<stdio.h>voidmain(){intarray[10],*pointer,i;
pointer=array;printf("Input10numbers:\n")
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 业主主要合同范本
- 土方供应合同范本
- 公馆购房合同范本
- 加入商场合作合同范本
- 农村柴火售卖合同范本
- 借用单位合同范本
- 个人顶账房合同范本
- 单位裁员解聘合同范本
- 分体空调保养合同范本
- 劳务大工小工合同范本
- 2025年黑龙江农业职业技术学院单招职业技能测试题库及答案1套
- 有创动脉血压监测
- 2025年国家林业和草原局管理干部学院招聘历年高频重点模拟试卷提升(共500题附带答案详解)
- 全国导游基础知识-全国导游基础知识章节练习
- 2025年春季开学典礼活动方案【哪吒版】少年无畏凌云志扶摇直上入云苍
- 【安排表】2024-2025学年下学期学校升旗仪式安排表 主题班会安排表
- 医药零售行业数字化转型-深度研究
- 2025年度老旧小区改造施工委托合同范本
- 四川省自贡市、遂宁市、广安市等2024-2025学年高一上学期期末考试语文试题 含解析
- 22G614-1 砌体填充墙结构构造
- 2024年全国教育大会精神全文课件
评论
0/150
提交评论