• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
C语言教程:第六章:指针(2)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
C语言教程:第六章:指针(2)
软件发布 C语言教程:第六章:指针(2)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 认证考试 >> 计算机等级考试 >> 计算机等级考试动态 >> C语言教程:第六章:指针(2)

C语言教程:第六章:指针(2)

添加时间: 2007-5-26 1:39:42  作者: 计算机等级考试认证参考  阅读次数:27   来源: http://www.d9soft.com

       

数组指针变量的说明和使用   

  指向数组的指针变量称为数组指针变量。 在讨论数组指针变量的说明和使用之前,我们先明确几个关系。   
一个数组是由连续的一块内存单元组成的。 数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量) 组成的。每个数组元素按其类型不同占有几个连续的内存单元。 一个数组元素的首地址也是指它所占有的几个内存单元的首地址。 一个指针变量既可以指向一个数组,也可以指向一个数组元素, 可把数组名或第一个元素的地址赋予它。如要使指针变量指向第i号元素可以把i元素的首地址赋予它或把数组名加i赋予它。   

  设有实数组a,指向a的指针变量为pa,从图6.3中我们可以看出有以下关系:   
pa,a,&a[0]均指向同一单元,它们是数组a的首地址,也是0 号元素a[0]的首地址。pa+1,a+1,&a[1]均指向1号元素a[1]。类推可知a+i,a+i,&a[i]   
指向i号元素a[i]。应该说明的是pa是变量,而a,&a[i]都是常量。在编程时应予以注意。   
main(){   
int a[5],i;   
for(i=0;i<5;i++){   
a[i]=i;   
printf("a[%d]=%d ",i,a[i]);   
}   
printf(" ");   
}   
主函数   
定义一个整型数组和一个整型变量   
循环语句    
给数组赋值   
打印每一个数组的值    
......   
输出换行   
......   
数组指针变量说明的一般形式为:   
类型说明符 * 指针变量名    
  其中类型说明符表示所指数组的类型。 从一般形式可以看出指向数组的指针变量和指向普通变量的指针变量的说明是相同的。   
引入指针变量后,就可以用两种方法来访问数组元素了。   
  第一种方法为下标法,即用a[i]形式访问数组元素。 在第四章中介绍数组时都是采用这种方法。   
  第二种方法为指针法,即采用*(pa+i)形式,用间接访问的方法来访问数组元素。   
main(){   
int a[5],i,*pa;   
pa=a;   
for(i=0;i<5;i++){   
*pa=i;   
pa++;   
}   
pa=a;   
for(i=0;i<5;i++){   
printf("a[%d]=%d ",i,*pa);   
pa++;   
}   
}   
主函数   
定义整型数组和指针   
将指针pa指向数组a   
循环   
将变量i的值赋给由指针pa指向的a[]的数组单元   
将指针pa指向a[]的下一个单元   
......   
指针pa重新取得数组a的首地址   
循环   
用数组方式输出数组a中的所有元素   
将指针pa指向a[]的下一个单元   
......   
......    
下面,另举一例,该例与上例本意相同,但是实现方式不同。   
main(){   
int a[5],i,*pa=a;   
for(i=0;i<5;){   
*pa=i;   
printf("a[%d]=%d ",i++,*pa++);&nbsp;  
}   
}   
主函数   
定义整型数组和指针,并使指针指向数组a   
循环   
将变量i的值赋给由指针pa指向的a[]的数组单元   
用指针输出数组a中的所有元素,同时指针pa指向a[]的下一个单元   
......   
......
数组名和数组指针变量作函数参数   

  在第五章中曾经介绍过用数组名作函数的实参和形参的问题。在学习指针变量之后就更容易理解这个问题了。 数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址, 形参得到该地址后也指向同一数组。 这就好象同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址, 数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。   
float aver(float *pa);   
main(){   
float sco[5],av,*sp;   
int i;   
sp=sco;   
printf(" input 5 scores: ");   
for(i=0;i<5;i++) scanf("%f",&sco[i]);   
av=aver(sp);   
printf("average score is %5.2f",av);   
}   
float aver(float *pa)   
{   
int i;   
float av,s=0;   
for(i=0;i<5;i++) s=s+*pa++;   
av=s/5;   
return av;   
}   

指向多维数组的指针变量   

本小节以二维数组为例介绍多维数组的指针变量。   

一、多维数组地址的表示方法   
设有整型二维数组a[3][4]如下:    
0 1 2 3   
4 5 6 7   
8 9 10 11    
  设数组a的首地址为1000,各下标变量的首地址及其值如图所示。在第四章中介绍过, C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。 数组及数组元素的地址表示如下:a是二维数组名,也是二维数组0行的首地址,等于1000。a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址。 也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。 &a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。 由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。 此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。   

  C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&;a[i],*(a+i)和a+i也都是等同的。另外,a[0]也   
可以看成是a[0]+0是一维数组a[0]的0号元素的首地址, 而a[0]+1则是a[0]的1号元素首地址,由此可得出a[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)。   
[Explain]#define PF "%d,%d,%d,%d,%d, "   
main(){   
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};   
printf(PF,a,*a,a[0],&a[0],&a[0][0]);   
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);   
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);   
printf("%d,%d ",a[1]+1,*(a+1)+1);   
printf("%d,%d ",*(a[1]+1),*(*(a+1)+1));
}   

二、多维数组的指针变量    

  把二维数组a 分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4] 它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。   

  二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度] 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。 “长度”表示二维数组分解为多个一维数组时, 一维数组的长度,也就是二维数组的列数。应注意“(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组(本章后面介绍),意义就完全不同了。   
[Explain]main(){   
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};   
int(*p)[4];   
int i,j;   
p=a;   
for(i=0;i<3;i++)   
for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));   
}   
’Expain字符串指针变量的说明和使用字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。 对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c;表示p是一个指向字符变量c的指针变量。而: char *s="C Language";则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。   
请看下面一例。   
main(){   
char *ps;   
ps="C Language";   
printf("%s",ps);   
}   
运行结果为:   
C Language    
上例中,首先定义ps是一个字符指针变量, 然后把字符串的首地址赋予ps(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入ps。程序中的: char *ps;ps="C Language";等效于: char *ps="C Language";输出字符串中n个字符后的所有字符。   
main(){   
char *ps="this is a book";   
int n=10;   
ps=ps+n;   
printf("%s ",ps);   
}   
运行结果为:   
book 在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。   
main(){   
char st[20],*ps;   
int i;   
printf("input a string: ");   
ps=st;   
scanf("%s",ps);   
for(i=0;ps[i]!=’’;i++)   
if(ps[i]==’k’){   
printf("there is a ’k’ in the string ");   
break;   
}   
if(ps[i]==’’) printf("There is no ’k’ in the string ");   
}   
  本例是在输入的字符串中查找有无‘k’字符。 下面这个例子是将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量PF代替了格式串。 这也是程序中常用的方法。   
main(){   
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};    #p#
char *PF;   
PF="%d,%d,%d,%d,%d ";   
printf(PF,a,*a,a[0],&a[0],&a[0][0]);   
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);   
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);   
printf("%d,%d ",a[1]+1,*(a+1)+1);   
printf("%d,%d ",*(a[1]+1),*(*(a+1)+1));   
}   
  在下例是讲解,把字符串指针作为函数参数的使用。要求把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。表达式:    
(*pds=*pss)!=`’   
cpystr(char *pss,char *pds){   
while((*pds=*pss)!=’’){   
pds++;   
pss++; }   
}   
main(){   
char *pa="CHINA",b[10],*pb;   
pb=b;   
cpystr(pa,pb);   
printf("string&nbsp;a=%s string b=%s ",pa,pb);   
}    
  在上例中,程序完成了两项工作:一是把pss指向的源字符复制到pds所指向的目标字符中,二是判断所复制的字符是否为`’,若是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下一字符。在主函数中,以指针变量pa,pb为实参,分别取得确定值后调用cprstr函数。由于采用的指针变量pa和pss,pb和pds均指向同一字符串,因此在主函数和cprstr函数中均可使用这些字符串。也可以把cprstr函数简化为以下形式:    
cprstr(char *pss,char*pds)   
{while ((*pds++=*pss++)!=`’);}   
  即把指针的移动和赋值合并在一个语句中。 进一步分析还可发现`’的ASCⅡ码为0,对于while语句只看表达式的值为非0就循环,为0则结束循环,因此也可省去“!=`’”这一判断部分,而写为以下形式:   
cprstr (char *pss,char *pds)   
{while (*pdss++=*pss++);}    
表达式的意义可解释为,源字符向目标字符赋值, 移动指针,若所赋值为非0则循环,否则结束循环。这样使程序更加简洁。简化后的程序如下所示。   
cpystr(char *pss,char *pds){   
while(*pds++=*pss++);   
}   
main(){   
char *pa="CHINA",b[10],*pb;   
pb=b;   
cpystr(pa,pb);   
printf("string a=%s string b=%s ",pa,pb);   
}

 

上下文章:

 

上一篇文章: 东营:2005年9月计算机等级考试即将报名 下一篇文章: 2005年全国计算机等级考试三级数据库考试大纲

相关文章:

  • PS教程:神奇 用Photoshop让美女走出画框
  • PS教程:看看如何用Photoshop把照片演变成水墨画
  • Photoshop教程:教你如何创出发丝的炫彩莹亮效果
  • 彻底DIY Vista主题制作教程(上)
  • 详解VLAN+路由器典型配置实例教程

相关软件:

  • 金梅电影程序第六版(美化版)
  • C语言资料大全 1.0
  • 易语言程序运行环境 4.11
  • 极品五笔教程 2007
  • C语言学习系统 V4.1
  • iTunes V7.6.2 多语言版

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

计算机等级考试分类导航

  • 计算机等级考试动态
  • 计算机一级考试
  • 计算机二级考试
  • 计算机三级考试
  • 计算机四级考试

本类经典文章推荐

  • 全国计算机等级考试三级网络技术(...
  • 三级网络技术复习笔记(第1-2章)
  • 三级笔试样题(PC技术)
  • 三级数据库技术样题
  • 三级网络技术复习笔记(5-7)
  • 三级网络技术复习笔记(第3-4章)
  • 笔试样题(网络技术)
  • 机考如何避免范围性错误
  • 2003年最新三级网络模拟题(2)
  • 全国计算机等级考试三级网络技术部...

计算机等级考试动态阅读排行

  • 计算机等级考试:VFp练习题1
  • 全国计算机等级考试三级网络技术(...
  • 完整的计算机等级考试上机模拟系统
  • 计算机等级考试:VFp练习题2
  • 历年操作系统论述题及答案(2)
  • 三级网络技术复习笔记(第1-2章)
  • 上海:计算机等级考试开始报名
  • 计算机二级VB软件环境、考试时间、...
  • 2005年全国计算机等级考试全真模拟...
  • 职称计算机考试报名今年最后一次

计算机等级考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题07
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级模拟试题06
  • 全国计算机等级考试一级模拟试题03
  • 一级(WINDOWS)试题解析-Word篇
  • 全国计算机等级考试上机考试应试技...

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有