• 指针和数组的关系


      数组名是一个指针常量,表示数组第一个元素的的起始地址。

     如 int a[5];  a表示数组第一个元素a[0]的起始地址&a[0]。

    一 引用数组元素的方法

      ①用数组下标引用数组元素

      数组a中元素用下标表示为: 

      a[0] a[1] a[2] a[3] a[4]

      ②用指针引用数组元素

      数组a中元素用下标表示为:

      int *p = a;  

      *p, *(p+1), *(p+2), *(p+3), *(p+4)

    二 数组和指针的关系

      ①既然p是指向数组第一个元素起始地址的指针,可以用*(p+i)表示数组中第i+1个元素,a也是指向数组第一个元素的指针啊,那么能不能用*(a+i)表示第i+1个元素呢?

      可以的,可以用printf 打印 *(a+i)的值验证

      ②反过来,a是指向数组第一个元素起始地址的指针,可以用a加数组下标引用数组元素,如a[3],p也是指向数组第一个元素起始地址的指针,能不能用p加数组下标引用数组元素?

      也是可以的,可以用printf 打印 p[0], p[1]....的值验证

    PS: 由上得,数组名a和指针p是一样的。实际上编译时,数组元素a[i] 就是当作 *(a+i)去处理的,先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,

      再然后通过*(a+i)得到第i个元素的内容。

      所以:数组的第i个元素直接写成*(a+i)的形式直接取得值,效率不就提升了吗。省去编译器先通过数组名a找到数组的首地址,然后首地址 a+i 得到元素a[i]的地址,

      再然后通过*(a+i)得到第i个元素的内容。

    三 指向数组的指针的自增

      int a[5];

      int *p = a; 

      可以 ++p 递增指针p指向下一个数组元素,然后用*p取得元素的值。

      能不能用a++或者++a把指针指向下一个数组元素? 不能!!! 开头就说过,数组名是指向数组首元素的指针常量。指针a是不可以指向其他元素的,只能指向首元素的起始地址。

    四 数组指针做形参

      把数组从主调函数传到被调函数时,我们可以传数组的首地址和数组长度就可以,为什么不是传递数组呢?还是为了效率,下面用代码说明:

      void Output(char *p, int len);

      int main()
      {
        char str[] = "HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld ";
        Output(str, strlen(str));
        system("pause");
        return 0;
      }

      void Output(char *p, int len)
      {
        for (int i = 0; i < len; ++i)
        {
          printf("%c", *(p + i));
        }
      }

    如上,如果我们Output函数不是用指针的方式char *p,而是用数组的方式char p[]的话,有什么不一样?

    我们定义的数组str有65字节,调用函数的话会传递这65字节的数组。

    char *p指针大小是4字节,只需要传递4字节的数据就可以了,不止少传递数据,执行起来也更快了。

    PS: 指针大小可以打印sizeof(int*),sizeof(char*)去验证。

  • 相关阅读:
    MongoDB学习(附录一) 安装mongodb3.6时碰到的问题
    详细图解mongodb下载、安装、配置与使用
    大数据时代的数据存储,非关系型数据库MongoDB
    python获取风和天气城市数据 ID
    智能车学习(二十一)——浅谈CCD交叉以及横线摆放
    智能车学习(二十)——浅谈C车硬连接与软连接
    智能车学习(十九)——硬件电路设计
    智能车学习(十八)——电机学习
    智能车学习(十七)——舵机学习
    智能车学习(十六)——CCD学习
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10249671.html
Copyright © 2020-2023  润新知