C语言 指针访问数组,C语言通过指针引用数组
C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
引入指针变量后,就可以用两种方法来访问数组元素了。
如果p的初值为&a[0],则:
p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。
*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用一个数组元素可以用:
下标法:即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。
指针法:即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其处值p=a。
【例10-9】输出数组中的全部元素(下标法)。
main(){ int a[10],i; for(i=0;i<10;i++) a[i]=i; for(i=0;i<5;i++) printf("a[%d]=%d\n",i,a[i]); }main(){
int a[10],i;
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<5;i++)
printf("a[%d]=%d\n",i,a[i]);
}
【例10-10】输出数组中的全部元素(通过数组名计算元素的地址,找出元素的值)。
main(){ int a[10],i; for(i=0;i<10;i++) *(a+i)=i; for(i=0;i<10;i++) printf("a[%d]=%d\n",i,*(a+i)); }main(){
int a[10],i;
for(i=0;i<10;i++)
*(a+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(a+i));
}
【例10.11】输出数组中的全部元素(用指针变量指向元素)。
main(){ int a[10],i,*p; p=a; for(i=0;i<10;i++) *(p+i)=i; for(i=0;i<10;i++) printf("a[%d]=%d\n",i,*(p+i)); }main(){
int a[10],i,*p;
p=a;
for(i=0;i<10;i++)
*(p+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(p+i));
}
【例10-12】
main(){ int a[10],i,*p=a; for(i=0;i<10;){ *p=i; printf("a[%d]=%d\n",i++,*p++); } }main(){
int a[10],i,*p=a;
for(i=0;i<10;){
*p=i;
printf("a[%d]=%d\n",i++,*p++);
}
}
几个注意的问题。
1) 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。
2) 要注意指针变量的当前值。请看下面的程序。
【例10-13】找出错误。
main(){ int *p,i,a[10]; p=a; for(i=0;i<10;i++) *p++=i; for(i=0;i<10;i++) printf("a[%d]=%d\n",i,*p++); }main(){
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
*p++=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
}
【例10-14】改正。
main(){ int *p,i,a[10]; p=a; for(i=0;i<10;i++) *p++=i; p=a; for(i=0;i<10;i++) printf("a[%d]=%d\n",i,*p++); }main(){
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
*p++=i;
p=a;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
}
3) 从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。
4) *p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。
5) *(p++)与*(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。
6) (*p)++表示p所指向的元素值加1。
7) 如果p当前指向a数组中的第i个元素,则:
*(p--)相当于a[i--];
*(++p)相当于a[++i];
*(--p)相当于a[--i]。
推荐阅读:http://blog.lightingchina.com/u/macaubcw/archives/2014/747002.html
阅读(163) | 评论(0) | 转发(0) |
C语言 指针访问数组,C语言通过指针引用数组相关推荐
- java中引用数组元素时 数组下标可以是_引用数组元素时,数组下标可以是( )...
摘要: .引用元素顾公众它包者和竞争业内应商企业部因外部的供等因素和素括企客.引用元素,相互系环境活动内部各部关系作.之间门之间以及与竞争营销有协企业企业企业微观务等的关.服是指.下标叙述功方罗汉的练 ...
- c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc
C语言的二数组的指针访问 二维数组的指针访问 --王炳华 指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点.如果真正弄懂了这个问题,就可以说你学会了使用指针. 二维数组的指针 指针就是地址 ...
- C语言——指针篇(三)数组的下标引用和指针访问
前言:在上一篇文章中,笔者介绍了指针和数组的内存分配以及初始化,这篇文章来整理下关于数组访问的两种方式. 数组的下标引用和指针访问 在正式开始介绍多维指针和多维数组之前,笔者要先介绍一些关于数组下标引 ...
- 指针c语言与数组,C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指针和 ...
- C语言中的结构体,结构体中数组初始化与赋值
最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...
- [编程神域 C语言浮游塔 第⑤期]内存地址——指针
前言 嗨嗨,这里是渡枫,欢迎阅读第五期的C语言浮游塔. 在正式学习指针之前,我们先提出几个问题. 什么是指针? 什么决定了数据的长度? 指针是否有类型? &a是指针吗? 一:指针就是一个变量的 ...
- c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?
C++| 匠心之作 从0到1入门学编程[免费]yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...
- C语言入门系列之6.一维和二维数组
数组 一.数组的概念 二.一维数组的定义与引用 1.一维数组定义 注意事项 常见错误 扩展:一维数组在内存中的存放 2.一维数组的引用 注意事项 3.一维数组的初始化 初始化赋值 动态赋值 三.二维数 ...
- c语言程序定义不知数量的一维数组,c语言程序设计10-第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组.ppt...
c语言程序设计10-第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 * 临沂大学汽车学院:韩晓翠 第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 授课要点 数组的概念 一维 ...
- c定义一个整型数组_C语言学习|数组
一.数组的定义 数组:由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数组的集合 元素:用一个统一的名字标识这组数据,这个名字称为数据名,构成数据的每一个数据项 下标:从0开始的整数,遵 ...
最新文章
- 通过分离dataSource 让我们的code具有更高的复用性.
- 来看看BAT在AR领域的布局,你给打几分?
- 2012-06-04 老男孩老师 “我毕业了”(转)
- python中数据分析的流程为-python数据分析011_数据分析流程
- C 双向链表的简单排序实现
- 给大家推荐一款高大上的代码高亮插件(sublime,github风格)——highlight.js
- 48session的生命周期
- 【转】2.2[译]async/await中阻塞死锁
- vue项目安装axios - cmd篇
- 定时任务crontab
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)
- Java在websocket获取Httpsession及bean无法注入问题
- Linux中sql*loader-350,SqlLoader
- ArcPad 8 简介
- 【转】扫盲 同步利器、分布式网盘--BT Sync
- IE地址栏的最大长度
- 论文阅读|《用强化学习求解带插单的动态FJSP》
- python 爬取海量网易云评论并写入数据库
- 如何实现用户关系的自动绑定?
- 【数据库系统】第一部分 数据库基础(4) 数据库安全性