C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素。

引入指针变量后,就可以用俩种方法来访问数组元素了。

如果p的初值为&a[0],则:

  1. P+i 和a+i 就是a[i]的地址,或者说它们指向a数组的第i个元素。
  2. *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。
  3. 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。

根据以上叙述,引用一个数组元素可以用:

1.下标法:即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。

2.指针发:即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其初值p=a。

输出数组中的全部元素(下标法):

#include<stdio.h>
int main(void)
{
int a[],i,j=;
//先给数组赋值
for(i=;i<;i++,j++)
{
a[i]=j;
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
system("pause"); }

输出数组中的全部元素(通过数组名计算元素的地址,找出元素的值)

#include<stdio.h>
int main(void)
{
int a[],i,j=;
//先给数组赋值
for(i=;i<;i++,j++)
{
*(a+i)=j; //*(a+i)=a[i]
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,*(a+i));
}
system("pause"); }

输出数组中的全部元素(用指针变量指向元素)。

#include<stdio.h>
int main(void)
{
int a[],i,j=,*p;
p=a;//初始化赋值指针变量
//先给数组赋值
for(i=;i<;i++,j++)
{
*(p+i)=j; //*(a+i)=a[i]=*(p+i)
}
//输出数组
for(i=;i<;i++)
{
printf("a[%d]=%d\n",i,*(p+i));
}
system("pause"); }
#include<stdio.h>
int main(void)
{
int a[],i,*p=a; //先给数组赋值
for(i=;i<;)
{
*p=i; //*p=a[i]
printf("a[%d]=%d\n",i++,*p++);
} system("pause"); }

几个注意的问题

1)指针变量可以实现本身的值的改变。如p++是合法的,而a++是错误的,因为数组啊是数组名,它是数组的首地址,是常量。

2)要注意指针变量的当前值,请看下面的程序

找出错误

main(){
int *p,i,a[];
p=a;
for(i=;i<;i++)
*p++=i;
for(i=;i<;i++)
printf("a[%d]=%d\n",i,*p++);
}

改正

main(){
int *p,i,a[];
p=a;
for(i=;i<;i++)
*p++=i;
p=a;
for(i=;i<;i++)
printf("a[%d]=%d\n",i,*p++);
}

从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。

3)*p++,由于++ 和*同优先级,结合方向自右而左,等价于*p(++)。

4)*p++和*(++p)的作用不同,若p的初值为a,则*p(++)等价a[0],*(++p)则等价a[1]。

5)(*p)++表示p所指向的元素值+1

6)如果p当前指向a数组中的第i个元素,则:

*(p--)相当于a[i--]

*(++p)相当于a[++i]

*(--p)相当于a[--i]

C---通过指针访问数组的更多相关文章

  1. YTU 2832: 使用指针访问数组元素--程序填空

    2832: 使用指针访问数组元素--程序填空 时间限制: 1 Sec  内存限制: 128 MB 提交: 328  解决: 160 题目描述 输入10个整数值到数组中,使用指针来完成对这10个数组元素 ...

  2. c++ 指针访问数组

    用指针访问一维数组 用指针访问二维数组 用指针访问三维数组 一. 用指针访问一维数组 //代码 ; ]={,}; int *p=&a; //int *p=&a[0]; printf(& ...

  3. 24深入理解C指针之---指针和数组

    一.指针和数组 #include <stdio.h> int main(int argc, char **argv) { ] = {, , , , ,}; int *ptrVector = ...

  4. C语言的指针和数组

    指针和内存 指针变量也是个变量,不过保存的是另一个变量的地址.另外编译器还会记住指针所指向变量的类型,从而在指针运算时根据变量类型采取不同操作. 例如,char * a 定义了char 类型的指针变量 ...

  5. C语言-再论指针与数组

    指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ...

  6. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  7. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  8. 指针与数组的区别 —— 《C语言深度剖析》读书心得

    原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...

  9. 指针 与 数组 以及 a 与 &a的区别

      指针 与数组 并没有什么关系,   指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到;   数组 ...

随机推荐

  1. HDU 1085-Holding Bin-Laden Captive!(生成功能)

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  2. 【cocos2d-x】尝鲜 Cocos Code IDE(不断更新)

    Cocos Code IDE 是一个基于 Eclipse 的跨平台 IDE ,专门为 cocos2d lua & js 开发者准备,通过此工具.你能够方便的创建游戏project.编写而且调试 ...

  3. ajax jsonp跨域

    js跨域问题是指:js不同域进行数据传输或通信之间,让我们用ajax到不同的域请求数据.或js获得在不同领域的框架页(iframe)数据.只有到协议.域名.port无论是有不同的.它们被认为是不同的域 ...

  4. 数据库 版本号是 661,打不开。此server支持 655 和更早的版本号。不支持降级路径

    "数据库 的版本号为 661,无法打开.此server支持 655 版及更低版本号. 不支持降级路径" 出现这种问题,通常是由于数据库版本号不同造成的. 我们能够用以下的语句查询数 ...

  5. android 处理器crash刊物

    日志记录程序是为了方便各种异常情况,为了方便日后的维修方案进行维修,程序无法百分百健康,完美,有必要保存在日志中代码.易于维护.Java了一个接口UncaughtExceptionHandler,Th ...

  6. Java中finally你知多少

    首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题, ...

  7. swift 笔记 (十九) —— 协议

    协议(Protocols) 协议仅是用定义某些任务或者是功能必须的方法和属性. 类似于java里的interface的作用.但协议并不会实现详细的功能. 我猜这个名字源于OO中提到的"契约& ...

  8. 使用log4j日志-配置载入问题

    1.在eclipse中,把log4j.properties放在类路径下,在项目启动时就会自己主动载入. 2.在idea中.把log4j.properties放在类路径下,可是项目启动时不能直接载入(原 ...

  9. TP-Link WR842N VPN错误619 不能建立到远程计算机的连接

    一直在用Tenacy这个VPN,不限时间不限流量的,可是近期发现链接VPN总是失败.在网上查了一下,发现居然是路由器的问题!回忆一下果然是路由器出事儿了,换这个842N之前,一直是能够链接VPN的,所 ...

  10. 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历

    原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过 ...