zoukankan      html  css  js  c++  java
  • 二维数组及指针

    首先,看一维数组。

    []符号是下标运算符,a[i]就是*(a+i)

    那么a[i][j] 就是*(a[i]+j)=*(*(a+i)+j)

     本人对二级和多级指针的理解:1.抽象上说二级指针的内容是地址的地址。变量A好像跟你捉迷藏似的,你要想找到A,你先得去一个地方把A的地址给找出来,然后再根据这个地址找到A。就类似武侠电影里的宝藏,你要先去一个人的背上发现藏宝图,然后再根据藏宝图里画的地址找到宝藏,在这里,这个人的背就是一个最外层的地址,藏宝图就是内层的地址。2.对于二级指针和多级指针,定义时,我们用多层衣服包裹上,先披上内层,再套上外层。而在使用二级指针和多级指针时,恰恰相反,我们要先脱去外层,再解开内层。


     再看二级指针和二维数组及二维数组名之间的一些关系。

    先运行下小程序。

    #include<stdio.h>
    
    void main() {
    
        int a[2][3] = {{1,2,3},{4,5,6}};
    
        printf("
    ");
        printf("a[0]的值:%x
    ",a[0]);
        printf("a[0][0]的地址:%x
    ",&a[0][0]);
        printf("a的值:%x
    ",a);
    
        printf("
    ");
        printf("a[1]的值:%x
    ",a[1]);
        printf("a[1][0]的地址:%x
    ",&a[1][0]);
        printf("a+1的值:%x
    ",a+1);
    
    }

    运行结果:

    结果分析:a+1是按照行移动的。

    接下去我们定义二级指针。看下面小程序。

    /**
    **  @author:hushunfeng
    **    
    */
    #include<stdio.h>
    
    void main() {
    
        int a[2][3] = {{1,2,3},{4,5,6}};
    
        int **p = a;
        printf("p+1之前:%d
    ",p);
        p++;
        printf("p+1之后:%d
    ",p);
    
    }

    结果:

    显然,二级指针的移动不是我们预想中的+12,而是+4,而这里的+4和int型没关系,换成char或者其他类型都是一样。说明程序的写法存在问题。

    我们对程序进行改进:

    /**
    **  @author:hushunfeng
    **    
    */
    #include<stdio.h>
    
    void main() {
    
        int a[2][3] = {{1,2,3},{4,5,6}};
    
        //改进的地方
        int **p = (int**)a;
    
        printf("p+1之前:%d
    ",p);
        p++;
        printf("p+1之后:%d
    ",p);

     运行结果:还是不行!

    为了证实之前说的内容,我们把int型换成char型尝试。

    /**
    **  @author:hushunfeng
    **    
    */
    #include<stdio.h>
    
    void main() {
    
        char a[2][3] = {{'a','b','c'},{'d','e','f'}};
    
        //改进的地方
        char **p = (char**)a;
    
        printf("p+1之前:%d
    ",p);
        p++;
        printf("p+1之后:%d
    ",p);
    
    }

    运行结果:还是老样子,结果并没有改变。

    下面分析下产生这种情况的原因:0.二维数组名其实只是一个指针,而二级指针是指向指针的指针,所以二者并不等价!!

                   1.首先我们定义的二级指针,那么应该有两层地址。

                   2.char **p; 也可以写成char*(*p),理解成*p的指针,也就是指针的指针。

                   3.而对指针的移位操作中,指针移位的幅度都是按照所指向的数据类型来确定的,这也就是为什么结构体stuct中,指针的移位都是以一整个结构体为单位的,而并不按照结构体内部的数据类型来一个个移位,以为整个结构体类型就是一个数据类型。这一点很重要!!

                   4.按照(3)的原则,那么char **p; p++;p所指向的类型还是一个指针类型,而指针类型就是一个地址,在32位系统下面就是占4个字节。所以p的值应该+4;这和p指针的指针指向的类型无关!!

    参考博文:http://blog.csdn.net/wzws45/article/details/6254312       

    http://www.cnblogs.com/wanpengcoder/archive/2010/07/17/1779503.html 

     http://bbs.csdn.net/topics/300258021 

     http://bbs.csdn.net/topics/90353391

                                    

  • 相关阅读:
    Delphi 2010下安装IOComp
    为自定义控件的某个属性添加像Winform控件中属性的注释
    C#WinForm仿qq窗体拖到windows窗体边上时,自动隐藏C#WinForm
    给图片添加水印,解决GIF添加水印的问题(无法从带有索引像素格式的图像创建 Graphics 对象)
    怎样把Image数据放入数据库
    取消IE“已限制此网页运行可以访问计算机的脚本
    sql 二进制文件的导入导出
    [转载]数据结构笔试题基础
    [转载]搜索算法(含基本搜索算法与深度搜索与广度搜索算法等思想)
    [转载]面试笔试总结
  • 原文地址:https://www.cnblogs.com/hushunfeng/p/3880867.html
Copyright © 2011-2022 走看看