4.8数组与指针基础-专题辅导课件_第1页
4.8数组与指针基础-专题辅导课件_第2页
4.8数组与指针基础-专题辅导课件_第3页
4.8数组与指针基础-专题辅导课件_第4页
4.8数组与指针基础-专题辅导课件_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计专题辅导课

数组与指针基础数组定义:类型名

数组名[数组长度]inta[10],x[5][5];#defineN5main(){intb[N];}inti=10;intc[i];数组初始化:

inta[10]={1,2,3};staticb[2][3]={{1,2}};intc[]={1,2,3,4};intx[][2]={1,2,3};部分元素初始化:其余元素的值动态存储为随机数,静态存储自动为0数组数组的使用:

inta[10],i;使a的所有元素值为1;

a=1;for(i=0;i<10;i++)a[i]=1;二维数组在内存中的存放方式inta[3][2];3行2列,6个元素表示1个3行2列的矩阵a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二维数组的元素在内存中按行/列方式存放a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二维数组在内存中的存放方式

inta[M][N],i,j;a[0][0]的地址是数组a在内存中存放的首(起始)地址a[i][j]距离起始地址的距离(偏移量)为:i*N+jinta[3][2];a[0][2],a[1][0]代表同一个数组元素字符串字符串常量用一对双引号括起来的字符序列一个字符串结束符'\0'"Happy"6个字符'H''a’'p’'p’'y''\0'有效字符字符串结束符字符串的有效长度:有效字符的个数strlen(s);返回字符数组s的字符串有效长度字符串的存储-数组初始化字符串可以存放在一维字符数组中

staticchars[6]={'H','a','p','p','y','\0'};字符数组初始化:用字符串常量staticchars[6]={"Happy"};staticchars[6]="Happy";chars[]="Happy";

s[0]s[1]s[5]s

Happy\0对字符串的操作把字符串放入一维字符数组(存储)对字符串的操作===>对字符数组的操作普通字符数组:数组元素的个数是确定的,一般用下标控制循环字符串:没有显式地给出有效字符的个数,只规定在字符串结束符

'\0'

之前的字符都是字符串的有效字符,一般用结束符

'\0'

来控制循环循环条件:s[i]!='\0'

举例(1)1.数组定义为inta[3][2]={1,2,3,4,5,6},数组元素_____的值为6。

A、a[3][2]

B、a[1][3]

C、a[1][2]

D、a[2][3]B举例(2)下列关于数组的定义,哪种说法是错误的()A.inta[1][3];B.intx[2][2]={1,2,3,4};C.intx[2][]={1,2,4,6}; D.intm[][3]={1,2,3,4,5,6};下列代码段的输出为()

staticinta[3][4]={{1,2,3},{4,5,6}};

printf(“%d”,a[0][5]);C5举例(3)不正确的赋值或赋初值的方式是______。

A、charstr[]="string";

B、charstr[7]={'s','t','r','i','n','g'};

C、charstr[10];str="string";D、charstr[7]={'s','t','r','i','n','g',’\0’};C数组名代表数组的首地址举例(4)

设变量定义为

chars[]="hello\nworld\n";,则数组s中有______个元素。A、12B、13C、14D、15下列代码段的输出为()

charc[]=“I\t\r\\\0will\n”;

printf(“%d”,strlen(c));A.4B.10 C.11D.15BA举例(5)下列代码段的输出为()#include<stdio.h>#include<string.h>main(){

charst[20]=”hello%d\0world!”;

printf(“%d,%d\n”,strlen(st),sizeof(st));}7,20选择法排序35281输入n(n<10),再输入n个数,用选择法将它们从小到大排序后输出。设n=535281(1)15283(2)2583(3)385(4)5835281(n=5)5个数(a[0]~a[4])中找最小数,与a[0]交换(1)15283a[4]<==>a[0]4个数(a[1]~a[4])中找最小数,与a[1]交换(2)12583a[2]<==>a[1]3个数(a[2]~a[4])中找最小数,与a[2]交换(3)12385a[4]<==>a[2]2个数(a[3]~a[4])中找最小数,与a[3]交换(4)12358a[4]<==>a[3]选择法(1)冒泡法排序35281输入n(n<10),再输入n个数,用冒泡法将它们从小到大排序后输出。设n=53528135281(n=5)逐个进行相邻的数比较,将大数交换到后一位32518(2)32512315(3)231213(4)211212358冒泡法举例(5)若输入89762425981116354<回车>,则以下程序的输出结果是_______。#include"stdio.h"#defineN10main(){

intx[N],y1[N],y2[N];

inti,j,n1,n2,t,p;n1=n2=0;

for(i=0;i<N;i++){

scanf(“%d”,&x[i]);if(x[i]%2==0)y1[n1++]=x[i];elsey2[n2++]=x[i];}

for(i=1;i<n1;i++)

for(j=0;j<n1-i;j++)if(y1[j]>y1[j+1]){ t=y1[j];y1[j]=y1[j+1];y1[j+1]=t;}

for(i=0;i<n2-1;i++){p=i;for(j=i+1;j<n2;j++)if(y2[p]<y2[j])p=j;

if(p!=i){t=y2[i];y2[i]=y2[p];y2[p]=t;}}

for(i=0;i<n1;i++)printf("%d,",y1[i]);

for(i=0;i<n2;i++)printf("%d,",y2[i]);}4,8,16,24,76,89,35,25,11,9,按偶数、奇数分成y1,y2冒泡法,从小到大选择法,从大到小举例(6)1.若输入为398653712421234<ENTER>,则输出为()#include"stdio.h"voidmain(){

intflag,i,j,k,col,n,ri,a[6][6];

for(ri=1;ri<=2;ri++){

scanf("%d",&n);

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

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

scanf("%d",&a[i][j]);flag=0;

for(i=0;i<n;i++){

col=0;

for(j=0;j<n;j++) if(a[i][col]<a[i][j])col=j;

for(k=0;k<n;k++)

if(a[i][col]<a[k][col])

break;

if(k>=n){

printf("a[%d][%d]=%d#",i,col,a[i][col]);

flag=1;

}

}

if(!flag)printf("NO#");

}}一行中最大的元素是否是同列中最大a[0][0]=9#a[1][2]=7#a[1][1]=4举例(7)1.输入123+234=357Yes?<回车>后,下列程序的输出结果是_______。#include<stdio.h>voidmain(){intk,n1,n3[10];charc;n1=0;for(k=0;k<10;k++)n3[k]=0;while((c=getchar())!='\n'){switch(c){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9': n3[c-'0']++; break;default: n1++; break;}}if(n1)printf("%d",n1);for(k=0;k<10;k++)if(n3[k])printf("%d",n3[k]);}6123111123+n3[1]=1n3[2]=1n3[3]=1n1=1234=n3[2]=2n3[3]=2n3[4]=1n1=2举例(8)程序填空,不要改变与输入输出有关的语句。输入一个正整数repeat(0<repeat<10),做repeat次下列运算:输入一个以回车结束的字符串(少于80个字符),滤去所有的非十六进制字符后,组成一个新字符串(十六进制形式),然后将其转换为十进制数后输出。输入输出示例:括号内为说明输入:2 (repeat=2)10+A输出:Dec=16Dec=10#include"stdio.h"#include"string.h"#defineMAXLEN80intmain(void){charch;charstr[MAXLEN],num[MAXLEN];

inti,k,t;

intrepeat,ri;longnumber;

scanf("%d",&repeat);

getchar();

for(ri=1;ri<=repeat;ri++){i=0;

while((ch=getchar())!='\n'){

str[i]=ch;i++;}

str[i]=0; t=0; for(k=0;k<i;k++)

if((str[k]>='0'&&str[k]<='9')||(str[k]>='a'&&str[k]<='f')||(str[k]>='A'&&str[k]<='F')){ num[t]=str[k]; t++; } num[t]='\0'; number=0; for(i=0;num[i]!='\0';i++){ if(num[i]>='0'&&num[i]<='9'){ number=number*16+(num[i]-'0');} else{ if(num[i]>='a'&&num[i]<='f') number=number*16+(num[i]-'a'+10); else number=number*16+(num[i]-'A'+10);break;} }

printf("Dec=%ld\n",number);}}

指针基础

内容提要

指针&地址&数据的访问机制指针变量指针&函数指针&一维数组指针&动态数组指针&地址&数据的访问机制地址内存单元1

23…

n…

n+1…intx=20,y=1;chararray[3];array[0]=‘a’;array[1]=array[0]+2;array[2]=‘b’;指针&地址&数据的访问机制地址内存单元100020x10021y1004‘a’array[0]1005‘c’array[1]1006‘b’array[2]intx=20,y=1;chararray[3];array[0]=‘a’;array[1]=array[0]+2;array[2]=‘b’;数据的直接访问指针&地址&数据的访问机制地址内存单元intx=20,y=1;……数据的间接访问100020x

…20081000(addr)p是一个指针类型的变量指向指针&地址&数据的访问机制要点:指针是一种指向其他数据对象的数据类型,通过保存其他数据对象的存储地址,可以指向任意类型的数据,从而提供一种对数据间接访问的机制。指针是内存单元的地址,但更准确的应该是特定类型存储单元的地址,它不是指向一个抽象的存储地址,而是指向具有明确类型的存储单元。指针变量—指针变量的定义类型名*

指针变量名;1.指针变量名不包括*

要点

inta,*p;float*f;char*c;指针变量2.指针变量中保存的是其他数据的存储地址,因此对指针变量的赋值往往与取地址的一元运算符&同时使用,而对指向数据的间接访问则通过一元的间接访问运算符*实现。要点

intx=5,*px;

px=&x; /*意味着:px指向x*/

pxx(or*px)&x5

指针变量2.指针变量中保存的是其他数据的存储地址,因此对指针变量的赋值往往与取地址的一元运算符&同时使用,而对指向数据的间接访问则通过一元的间接访问运算符*实现。指针在没有指向具体的数据对象之前,不能够进行*运算。要点指针变量3.指针类型是所指向数据的类型。对编程者是一种检验手段,说明编程者使用这个指针对什么样的数据进行操作;对编译系统而言,主要用来获取指针所指数据类型的长度,并以此确定指针单位增量的长度,以便在对指针的内容进行增减是得出正确的结果。

因此一般情况下不同类型的指针既不能相互转换,也不能相互赋值。要点指针变量—指针的初始化1.可以用取已定义的同类型的变量的地址对指针变量初始化;2.可以用NULL对指针变量初始化;要点指针变量—指针运算合法的运算包括:相同类型指针的赋值、指针值的整数增减、指向同一数组中元素的指针相减、指针的比较、强制类型转换以及经过合法强制类型转换的指针赋值。要点指针&函数—指针作为函数参数1.通过指针方式传递数组、结构等大型参数以避免直接传递大量的数据;2.通过指针操作的方式绕开函数参数的值传递方式所带来的限制,使函数可以从内部直接对函数外部的变量进行操作,还可以达到返回多个值的作用。要点例:输入年和天数,输出对应的年、月、日。例如:输入2000和61,输出2000-3-1。定义函数month_day(year,yearday,*pmonth,*pday)用2个指针作为函数的参数,带回2个结果intmain(void){

intday,month,year,yearday;voidmonth_day(int

year,int

yearday,int*pmonth,int*pday);

printf(“inputyearandyearday:”);

scanf("%d%d",&year,&yearday);

month_day(year,yearday,&month,&day);

printf("%d-%d-%d\n",year,month,day); return0; }voidmonth_day(intyear,int

yearday,int*pmonth,int*pday){intk,leap;

inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31},};

/*建立闰年判别条件leap*/leap=(year%4==0&&year%100!=0)||year%400==0;

for(k=1;yearday>tab[leap][k];k++)

yearday-=tab[leap][k];*pmonth=k;*pday=yearday;}inputyearandyearday:200061

2000-3-1monthdaypmonthpday31指针&一维数组—指针和数组的互换

df08df08

voidmain(){inta[3]={1,2,3};

printf(“%x%x”,a,&a[0]);}a[0]a[1]a[2]a数组名是数组首元素的指针aa+1a+ia+9a[0]a[1]a[9]a[i]&a[0]&a[1]&a[9]&a[i]inta[10];inta[10];int*p;p=&a[0];,p,,p+1,,p+i,,p+9,inta[10];int*p;p=a;inta[10];int*p=&a[0];inta[10];int*p=a;,*p,,*(p+1),,*(p+i),,*(p+9),

*a

*(a+1)

*(a+i)

*(a+9),p[0],p[1],p[9],p[i]指针运算可以代替数组的下标运算来确定数组中的元素,数组下标的任何运算都可以用指针实现。类似的,以数组的语法是哟个指针在语法上也是合法的。1.数据元素的引用方式:

(1)下标法:a[3],p[3];

(2)指针法:*(a+3),*p;2.越界控制由程序员控制3.数组是连续的存储空间,而指针只是一个保存地址的存储单元。数组名是常量,而非指针变量要点

inta[10],*p;a=p;a++;a=a+3;

p=a;p++;

指针&一维数组—数组名作为实参的形参形式voidmain(){

inta[10];......f(a,10);......}

f(intx[],intn){......}f(int*x,intn){......}

voidmain(){

inta[10];

int*p;......p=a;f(p,10);......}数组名做为函数的参数,在函数调用时,将实参数组首元素的地址传给形参(指针变量),因此,形参也指向实参数组的首元素。如果改变形参所指向单元的值,就是改变实参数组首元素的值。或:形参数组和实参数组共用同一段存贮空间,如果形参数组中元素的值发生变化,实参数组中元素的值也同时发生变化。要点floataverage(float*array){inti;floataver,sum=0;for(i=0;i<10;i++)sum+=array[i];aver=sum/10;return(aver);}main(){floatscore[10],aver;

inti;for(i=0;i<10;i++)

scanf(“%f”,&score[i]);aver=average(score);

printf("%f\n",aver);}floatarray[10]floatarray[]floataverage(float*array){inti;floataver,sum=0;for(i=0;i<10;i++)sum+=array[i];aver=sum/10;return(aver);}score

score[0]score[9]array*(array+i)main(){floatscore[10],aver;

inti;for(i=0;i<10;i++)

scanf(“%f”,&score[i]);aver=average(score);

printf("%f\n",aver);}charsa[]=“Thisisastring”;sa[0]=‘t’;sa=“Hello”;sa[0]sa[1]sa[i]sa\0\0Thisisastring复制字符数组拥有连续的内存单元,数组名永远指向数组的首元素;若要改变数组所代表的字符串,只能改变数组元素的内容指针&一维数组—字符数组和字符指针Th..........gtchar*str=“Thisisastring”;charsa[]=“hello”;str=sa;str=“newstring”;字符指针变量可以指向不同的字符;若要改变指针所代表的字符串,通常直接改变指针的值,让它指向新的字符串\0Thisisastringstrhello\0sastr,newstringstr\0hello\0char*s;scanf(“%s”,s);char*s,str[20];s=str;scanf(“%s”,s);字符指针-先赋值,后引用输入的字符串实际存放在字符数组str中char*str,*format;str=“IloveChina”;str=str+7;printf(“%s”,str);printf(“%c”,str[-3]);format=“%s”;printf(format,str-7);IloveChinastr\0ChinavIloveChina指针&一维数组—字符串函数1、字符串的输入和输出(stdio.h)输入函数以字符数组名(或指向数组首元素的指针变量,下同)为参数

scanf("%s",str)遇回车或空格输入结束,并自动将输入的一串字符和‘\0’送入数组中

gets(str)遇回车输入结束,自动将输入的一串字符和‘\0’送入数组中指针&一维数组—字符串函数1、字符串的输入和输出(stdio.h)输出函数以字符数组名或字符串常量为参数,输出遇'\0'结束

printf("%s",str)

printf("%s","hello");

puts(str)

puts("hello");

puts输出字符串后自动换行,而printf不换行2、字符串的复制、连接、比较、求字符串长度

(string.h

)字符串复制:strcpy(str1,str2)字符串连接:strcat(str1,str2)字符串比较:strcmp(str1,str2)求

温馨提示

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

评论

0/150

提交评论