zoukankan      html  css  js  c++  java
  • 指针知识梳理10-指向数组的指针

    一、指向数组的指针

    1、所谓指向的意思:我们通常说指针变量指向某个变量或者某块内存,意思是这个指针变量存储了某个变量的地址或者某块内存的地址。

    2、一个变量能够占多个字节,我们通常所说某个 的地址指的是这块内存的起始地址。比方int  a,变量a栈 0x10 0x11 0x12 0x13这四个字节,那么a的地址是0x10.

    3、(1)曾经我们定义一个数组的时候,一般是把这个数组当做同种类型的变量的集合来看的,即数组的每一个元素。使用方法为a[i].

           (2)我们也能够把数组当做一个总体来看。int  a[5],  a是个变量。这个变量的类型是数组,这个变量占40个字节,。

                      依照变量定义基本模型 type  name ,假设数组是这么定义可能更好理解这个总体概念, int[10]   a,可是C语言语法不是这样写的。

             (3) 得到一个变量的地址 用&符号。那么当把数组a看做一个变量的时候。它的地址为 &a.

                   假设要存储 &a这个数据,须要对应的指针变量,即所谓指向数组的指针。

                   定义方法例如以下  int (*p)[5]。事实上依照  type *p 这个模型来定义,int[5]  *p 这样的写法更好理解,仅仅只是C语言的爸爸在创造语法的时候不这么规定。

                  那么 p = &a;

                  对于 p 来说。p+i 地址偏移 i*sizeof(a)  

              (4) 下面须要分清楚区分

                    对于 int a[5];

                      &a 与 &a[0] 的差别。这两个得出来的地址 在数值上是相等的,可是他们的数据类型是不一样的。

                      int  *p1 = &a[0];

                      int  (*p2)[10] ;

                      p2 = &a;

                     

                       如上图。我们分别把数组当做集合和总体来看。

                       p1 存储a[0]的地址 。也就是a[0]的起始地址。0x10.

                       p2 存储a的地址,也就是数组的事实上地址。也是a[0]的起始地址 0x10.

                       p1+1  结果为 0x14

                       p2+1  结果为 0x24

    4、typedef 使用方法

          typedef  int(type*)[5];

          type 是种类型,是指向一维数组的指针类型(说法比較拗口),下面写法定义变量p1是等效的。

          type  *p1;

          int (*p1)[5];

    5、在语法层面上使用

            typedef  int(type*)[5];

            int  a[5];

            type p;

            p = &a; //这里数组名就不代表的是a[0]的地址了。

            那么 *p 就是 a 了。

            a[i] ---> (*p)[i];// 注意这里优先级


    二、二维数组的数组名

           int  a[2][3];

           二维数组能够看成一维数组。a[0]   a[1]是数组的两个元素,每一个元素是 个一维数组 (int[3]).

           一维数组的数组名能够代表第一个元素的地址,第一个元素是个int[3]型的数组。

         

    typedef  int(*p)[3];
    int a[2][3];
    p = a;
    p = &a[0];
    for(i = 0;i<2;i++)
    {
    	for(j = 0;j<3;j++)
    	{
    	//下面几种方式等效
    		a[i][j]  = 1;
    		*(*(p+i)+j)  = 1;
    		*(p[i]+j) = 1;
    		p[i][j] = 1;
    	}
    }
    








                   





  • 相关阅读:
    Go语言学习之1 基本概念、环境搭建、第一个Go程序
    go环境搭建
    go 圣经阅读笔记之-入门
    RabbitMQ
    图片选择并使用base64展示
    关于c# hashtable的一个注意点
    js image to base64 摘录
    linq to sql 获取sql与参数添加到日志中
    时钟的实现
    无限级菜单的实现
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6950181.html
Copyright © 2011-2022 走看看