首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > C语言 > 复习资料 > 正文

二级C辅导教程及考点分析:第六章 指针

 

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

    指向数组的指针变量称为数组指针变量。 在讨论数组指针变量的说明和使用之前,我们先明确几个关系。
    一个数组是由连续的一块内存单元组成的。 数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量) 组成的。每个数组元素按其类型不同占有几个连续的内存单元。 一个数组元素的首地址也是指它所占有的几个内存单元的首地址。 一个指针变量既可以指向一个数组,也可以指向一个数组元素, 可把数组名或第一个元素的地址赋予它。如要使指针变量指向第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\n",i,a[i]);
    }
    printf("\n");
    }
    主函数
    定义一个整型数组和一个整型变量
    循环语句 
    给数组赋值
    打印每一个数组的值 
    ......
    输出换行
    ......
    数组指针变量说明的一般形式为:
    类型说明符 * 指针变量名 
    其中类型说明符表示所指数组的类型。 从一般形式可以看出指向数组的指针变量和指向普通变量的指针变量的说明是相同的。
    引入指针变量后,就可以用两种方法来访问数组元素了。
    第一种方法为下标法,即用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\n",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\n",i++,*pa++);
    }
    }
    主函数
    定义整型数组和指针,并使指针指向数组a
    循环
    将变量i的值赋给由指针pa指向的a[]的数组单元
    用指针输出数组a中的所有元素,同时指针pa指向a[]的下一个单元
    ......
    ......

    数组名和数组指针变量作函数参数

    在第五章中曾经介绍过用数组名作函数的实参和形参的问题。在学习指针变量之后就更容易理解这个问题了。 数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址, 形参得到该地址后也指向同一数组。 这就好象同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址, 数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。
    float aver(float *pa);
    main(){
    float sco[5],av,*sp;
    int i;
    sp=sco;
    printf("\ninput 5 scores:\n");
    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,\n"
    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\n",a[1]+1,*(a+1)+1);
    printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
    }

上一页  1 2 3 4 5 6 7 下一页
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。