二级指针与二维数组课件_第1页
二级指针与二维数组课件_第2页
二级指针与二维数组课件_第3页
二级指针与二维数组课件_第4页
二级指针与二维数组课件_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

二级指针与二维数组二级指针与二维数组7.9指向指针的指针

1.指向指针的指针的定义、赋值及引用如果一个指针变量存放的是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,简称为“二级指针”变量,其定义的一般格式如下:基类型名**(指针变量名);例如:

inti=10; int*p=&i; int**pp=&p;7.9指向指针的指针1.指向指针的指针的定义、赋值及引下列程序段的输出结果是()int**pp,*p,a=10,b=20;pp=&p;p=&a;p=&b;printf("%d,%d\n",*p,**pp);A)10,20 B)20,10C)20,20D)10,10下列程序段的输出结果是()7.7指向二维数组的指针

7.7.1二维数组的地址C语言中,二维数组可以看成由多个一维数组组成。例如:inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};可以按下面的方式来看待数组a:二维数组a可以看成是由a[0]、a[1]、a[2]三个元素组成的一维数组,a是它的数组名。a[0]、a[1]和a[2]又都是一维数组,它们的数组名分别叫a[0]、a[1]和a[2]。由于数组名是指针,所以a[0]、a[1]和a[2]为一级指针,它们的基类型是int。a是是由三个一级指针组成的数组。

a与a[0]的区别?a+1与a[0]+1区别?7.7指向二维数组的指针7.7.1二维数组的地址a与aa+1跨过了二维数组的一行,所以,a、a+1和a+2称为行地址。相对于a[0]而言,a[0]+1只跨过了二维数组的一个元素,所以将a[0]、a[0]+1、a[0]+2等称为列地址。a+1跨过了二维数组的一行,所以,a、a+1和a+2称为行地通过以上分析可以看出:(1)a+i是第i行的地址,所以,*(a+i)即为a[i]。这样,a[i][j]等价于(*(a+i))[j]。(2)a[i]+j是第i行第j列元素的地址,所以,*(a[i]+j)等价于a[i][j]。将a[i]用*(a+i)替换得:*(*(a+i)+j)也等价于a[i][j]。上述等价关系总结如下:a[i][j]←→(*(a+i))[j]←→*(a[i]+j)←→*(*(a+i)+j)通过以上分析可以看出:用二级指针访问二级数组#include<stdio.h>#defineN2#defineM3intmain(void){ staticinta[N][M]={1,2,3,4,5,6}; int*arr[N]={a[0],a[1]}; inti,j,**p=arr; for(i=0;i<M;i++) printf("%d",*(*p+i)); printf("\n");

for(j=0;j<N;j++) for(i=0;i<M;i++) printf("%d",*(*(p+j)+i)); printf("\n"); return0;}运行结果如下:123123456用二级指针访问二级数组#include<stdio.h> 二维数组a123456a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]指针数组arra[0]a[1]pp+1arr[0]arr[1]二级指针变量p*p*(p+1)*p+1*(p+1)+1*(p+1)+2二维数组a123456a[0][0]a[0][1]a[0][7.7.2指向二维数组行的指针变量也就是定义指向二维数组行的指针变量。例如,对二维数组a[3][4],可用如下格式定义指向行的指针变量:int(*p)[4];其中,[4]表示二维数组列的大小对行指针进行赋值时只能赋行地址。例如:

inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; int(*p)[4]; p=a;或p=&a[0];不能赋列地址,如下面的赋值语句是错误的:

p=a[0]; 或 p=&a[0][0];7.7.2指向二维数组行的指针变量也就是定义指向二维数组行若有定义语句int(*p)[4];,则以下说法正确的是()A)定义语句非法B)p是一个指针数组,每个元素是一个指向整型变量的指针变量C)p是一个行指针变量,可以将每行具有四个整型元素的二维数组名赋给它D)p是一个指向整型变量的指针变量若有定义语句int(*p)[4];,则以下说法正确的是(设有程序段:inta[2][3],(*pa)[3],x;pa=a;则以下对数组元素的引用,错误的是()A)x=*(a[0]+2); B)x=*pa[2];

C)x=pa[0][0];D)x=*(pa[1]+2);设有程序段:7.6指针数组一维指针数组的定义格式如下:

基类型*指针变量名[数组长度];例如:int*p[3],i=1,j=2,k=3;p[0]=&i;p[1]=&j;p[2]=&k;printf("%d,%d,%d\n",*p[0],*p[1],*p[2]);数组元素是指针7.6指针数组一维指针数组的定义格式如下:数组元素是指针若有定义语句:

char*name[]={"JAME","XML","C++"};,则语句printf("%s\n",name[2]);的输出结果是()A)JAME B)XML C)C++D)不定值若有定义语句:

char*name[]={"JAME","【例7-14】对参加北京奥运会的国家名称按由小到大的顺序排序后输出。采用两种方法来实现,并比较它们的优劣,以便体会到采用指针的好处。数组法与指针法【例7-14】对参加北京奥运会的国家名称按由小到大的顺序排序#include<stdio.h>#include<string.h>#defineN4#defineLEN20voidmain(){ inti,j; chartemp[LEN],name[N][LEN]={“China”,”America”,”Australia”,”Japan”}; for(i=1;i<=N;i++) //排序,控制趟数

for(j=0;j<N-i;j++) //控制每一趟的比较次数

if(strcmp(name[j],name[j+1])>0 { strcpy(temp,name[j]); strcpy(name[j],name[j+1]); strcpy(name[j+1],temp); } for(i=0;i<N;i++) printf("%s\n",name[i]);}#include<stdio.h>#include<stdio.h>#include<string.h>#defineN4voidmain(){ inti,j;char*temp,*name[N]={"China","America","Australia","Japan"}; for(i=1;i<=N;i++) //排序,控制趟数

for(j=0;j<N-i;j++) //控制每一趟的比较次数

if(strcmp(n

温馨提示

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

评论

0/150

提交评论