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。

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

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[],i,j=;
  5. //先给数组赋值
  6. for(i=;i<;i++,j++)
  7. {
  8. a[i]=j;
  9. }
  10. //输出数组
  11. for(i=;i<;i++)
  12. {
  13. printf("a[%d]=%d\n",i,a[i]);
  14. }
  15. system("pause");
  16.  
  17. }

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

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[],i,j=;
  5. //先给数组赋值
  6. for(i=;i<;i++,j++)
  7. {
  8. *(a+i)=j; //*(a+i)=a[i]
  9. }
  10. //输出数组
  11. for(i=;i<;i++)
  12. {
  13. printf("a[%d]=%d\n",i,*(a+i));
  14. }
  15. system("pause");
  16.  
  17. }

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

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[],i,j=,*p;
  5. p=a;//初始化赋值指针变量
  6. //先给数组赋值
  7. for(i=;i<;i++,j++)
  8. {
  9. *(p+i)=j; //*(a+i)=a[i]=*(p+i)
  10. }
  11. //输出数组
  12. for(i=;i<;i++)
  13. {
  14. printf("a[%d]=%d\n",i,*(p+i));
  15. }
  16. system("pause");
  17.  
  18. }
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a[],i,*p=a;
  5.  
  6. //先给数组赋值
  7. for(i=;i<;)
  8. {
  9. *p=i; //*p=a[i]
  10. printf("a[%d]=%d\n",i++,*p++);
  11. }
  12.  
  13. system("pause");
  14.  
  15. }

几个注意的问题

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

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

找出错误

  1. main(){
  2. int *p,i,a[];
  3. p=a;
  4. for(i=;i<;i++)
  5. *p++=i;
  6. for(i=;i<;i++)
  7. printf("a[%d]=%d\n",i,*p++);
  8. }

改正

  1. main(){
  2. int *p,i,a[];
  3. p=a;
  4. for(i=;i<;i++)
  5. *p++=i;
  6. p=a;
  7. for(i=;i<;i++)
  8. printf("a[%d]=%d\n",i,*p++);
  9. }

从上例可以看出,虽然定义数组时指定它包含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. Windows 8实例教程系列 - 数据绑定高级实例

    原文:Windows 8实例教程系列 - 数据绑定高级实例 上篇Windows 8实例教程系列 - 数据绑定基础实例中,介绍Windows 8应用开发数据绑定基础,其中包括一些简单的数据绑定控件的使用 ...

  2. 右键菜单中的好友列表Ajax直接跳转请求到登陆页面

    今天,我们正在做正确的菜单.当点击重命名Ajax要求,并且不发送数据的背景,但直接跳到主页. 我百思不得其解,后来我发现在头版的一个问题: <li><a href='#' oncli ...

  3. HDU 4946 Area of Mushroom 凸包

    链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...

  4. IntelliSense 无法仅由函数的返回类型重装分辨

    IntelliSense:无法仅由函数的返回类型重装分辨       d:\programfiles (x86)\microsoft sdks\windows\v7.0a\include\winbas ...

  5. DM8168 新三板系统启动

    DM8168从补丁到系统的新董事会开始折腾了20天,最终完成,高校是累的东西,导师只焊接机10一个BGA,其他人则手. 前段时间启动操作系统时,到了Starting Matrix GUI applic ...

  6. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  7. 基于最简单的FFmpeg采样读取内存读写:内存玩家

    ===================================================== 基于最简单的FFmpeg样品系列读写内存列表: 最简单的基于FFmpeg的内存读写的样例:内 ...

  8. Android与server通信中的方法(TCP)高效的安全完整

    我以前一直使用sockets实现emulator和PC进行通讯,卡了几天,最后请教其它人最终能够连接了.  错误原因是在IP和port,IP要用本机IP(在CMD输入ipconfig.注意:每次开机本 ...

  9. Appium - iOS Mac环境结构

    Appium - iOS Mac环境结构 笔者: Max.Bai 时间: 2014/10 1. iOS开发环境的搭建 1.1系统要求 MacOS X 10.7 or higher, 10.9.2 re ...

  10. 解决win10客户机本地账户登陆导致远程桌面没法访问问题

    情景:客户机器如果是win10本地账户,我们远程桌面连接是可能会没法访问. 如果客户机器切换到win10 Microsoft账户登录,远程桌面就可以访问了(当然用户肯定不能给你说自己的Microsof ...