我手头上的书都是讲到一级指针的,网上关于多级指针的资料也好少,所以到这来求救了。还望高手不吝赐教。比如我对如下用法很是不解:
DWORD **p_Sound;
DWORD *p_Num;
………
p_Sound[i]=p_Num;
……
一个二级指针加个下标表示什么意思,偏移量吗?那如果是p_Sound[i][j]呢,是不是指p_Sound[i]所指向的地址再偏移j个单位地址?
定义p_Sound时指出只开辟一个地址空间,他一偏移,是不是有可能占用了别人的地址。很是糊涂,或者这种用法就是错误的,还请指点一二。
如果你对多级指针有很好的理解方法,我真的很想知道。

解决方案 »

  1.   

    我想你贴的代码不全了,p_Sound还没有初始化就使用了,我觉得在你的第一个省略号的地方有p_Sound的初始化,而且类似于p_Sound = new *DWORD[10]之类的东西,所以下面才可以那样用。
      

  2.   

    首先你要理解下标操作符[]的意义:p[i]相当与*(p + i).多级指针其实跟多维数组本质是一样的,一个有n个**的指针可以指向一个n维的数组(该数组定义时有n个[]).p_Sound[i][j]相当与*(*(p+i)+j),所以你的理解没错,它就是指p_Sound[i]所指向的地址再偏移j个单位地址所得到的地址的内容,注意是内容!C++对指针的下标是不做范围检查的,比如一个指向int array[10]的指针p,如果这样用p[20]也是没有编译错误的,但这样其实是有逻辑错误的,不小心的话就会破坏其它数据,非法操作大部分原因就是由于指针访问到系统保护区域造成的.最后提醒你,指针一定要指向一个存在的对象,如果定义指针是不马上指向对象就应该把它设置为NULL(也就是0).
      

  3.   

    前提:
    DWORD **p_Sound :是双指针
    DWORD *p_Num :普通指针
    结论:
    p_Sound[i]=p_Num;评论:
      你中间代码,不明确, p_Sound是必须要初始化的,因为你用到了       p_Sound[i],(也就是说你要给p_Sound[i]分配空间)p_Sound[i][j]: 是p_Sound[i]所指的数组的第j个元素!  
       
      

  4.   

    指针的初始化有什么问题?不知道你指什么问题,随便说说先比如你上面最好成绩改成
    DWORD **p_Sound = NULL;
    DWORD *p_Num = NULL;
    ………
    p_Sound[i]=p_Num;省略好那要怎么赋值在来,还有,NULL其实就是一个等于0的宏,包含iostream就有了(记得using namespace std;),iostream.h可没有哦
    NULL用0代替也完全一样,只是可读性差了点而已,不清楚的再问,我会回来看看的
      

  5.   

    “多级指针其实跟多维数组本质是一样的,一个有n个*的指针可以指向一个n维的数组(该数组定义时有n个[])”
    那为什么我这么用就不对:
    int array[5][10];
    int **pArray;
    pArray=array;怎么在定义pArray时,能指明数组的各维大小。
    不然,*(*(pArray+i)+j)将是一个不明确的指针。
      

  6.   

    对任意指针都可以转化成*(p)的形式, 要理解它就不能把p当作是一个变量, 而应该看成表达式.
        任何表达式都有一个值, 再把这个值当做地址, 那么指针*(p)就是取在地址p处存储的值,也就是说*(p)是一个值, p是地址.
        而多级指针就是说p本身就是一个指针,根据前面说的p可以转化成*(q)
    的形式, 那么*(q)就是将表达式q的值当做地址, 然后取在地址q处存储的值, 这个值就是p的值,那么*(p)就是在地址p处存储的值.
        所以对任何形式的指针*(p)你值需要记住*(p)是取值,p是地址,*(p)就是取在地址p处存储的值.
      

  7.   

    要理解多级指针和多位数组的联系和区别我们先来看看一级指针和一维数组.
    先看下面的几个语句:
       int *p = 0; //正确
       int a[5] = {1,2,3,4,5}; //正确
       //输出 *a, 这时 *a == 1;
       int *q = {1,2,3,4,5}; //错误
       p = a; //正确, 输出*p, 这时 *p == 1;
       p++; //正确, 输出*p, 这时*p == 2;
       //输出 p[1], 这时p[1] == 3;
       //输出 *a, 正确, 这时 *a == 1;
       *a = 0; //正确, 这时 *a == 0;
       *a = {0, 0}; //错误
    你发现没有? 我们可以一次为数组a的5个元素赋值,但我们只能赋一个值给指针p, 当我们将数组名
    当指针用时, 我们也只能一次赋一个值. 即一维指针只能指向一个元素, 一维数组可以同时拥有多
    个元素.
      

  8.   

    楼上那位大哥,你这么说我能理解。
    你能把二维数组和二级指针说一下吗?
    int *p=0;
    int a[5];
    p=a;//这是对的。int **p=0;
    int a[4][5];
    p=a;//这是错的。??
      

  9.   

    怎么给一个二级指针赋值。就像一级指针p=a一样。
    使得二级指针能和二维数组联系起来,
    使得*(*(p+i)+j)就等于a[i][j]。
    ??
      

  10.   

    对于二维数组 int array[5][10];我们不妨这么拆开来看:
    先声明一个一维数组 int A[10];
    再将 A[10]当作一种数据类型 B, 再用 B 来声明一个一维数组:
    B array[5];
    这样一来我们就好理解了,一位数组 array 的每个元素的类型都是B,即数组array的每个元素都是一个包含10个整数元素的数组, 即数组array的元素类型是数组, 这点要特别注意.
    所以数组array的声明就成了 int array[5][10]; array 也就是一个 二维数组了.
      

  11.   

    int *p=0;
    int a[4][5];
    p=a;
    这样就可以了呀!数组和指针的关系没有搞清楚.......
    谭浩强的c语言还是要复习复习的。
      

  12.   

    跃然兄:你那样是不可以的。(不信你自己试一下)
    应该是这样:
    int (*p)[4];
    int a[4][5];
    p=a;
      

  13.   

    我发现二维指针就是没有办法和二维数组联系起来。
    int **p=NULL
    int a[3][3];
    ……
    永远不可能p=a;
    不管中间怎么处理。
    所以在讨论多维指针时引入数组是非常必要的。
    如果我现在这个想法是对的,那我想我已经理解的差不多了。
    还请大家给个话。
      

  14.   

    我们一起看看下面的两种声明由什么不同:
    1.   int *p[10];
    2.   int (*q)[10];
        这里有一个运算符优先级的问题, []的优先级高于 * ,所以第一种情况是
        int* (p[10]); 这种形式的声明意义在于 首先 p 是一个一维数组, 其次数组p 的每个元素都是一个
    整型指针所以数组p 是指针数组, p是一个1级指针.
        而二种情况则不同由于你加了(),() 和 [] 的优先级时同一级别的,结合方式为从右往左结合
    所以 int (*q)[10]; 的意义在于首先 q 是一个指针, 其次指针q 指向一个包含10个整型元素的数组,所以指针q是数组指针, 指针 q 是一个二级指针.
        所以有下面的情况:
        int int a[3][4]={1,2,3,4,5,6,7,8,9};
        int (*p)[4];
        int *q[4];
        p=a;//,*(p+i)+j是可用的
        q = a; //错误
      

  15.   

    嗷:“int (*q)[10]; 的意义在于首先 q 是一个指针, 其次指针q 指向一个包含10个整型元素的数组,所以指针q是数组指针, 指针 q 是一个二级指针.”
    我明白了。看来我原先对多级指针的理解还是不对。
    因为我误以为:一个n维指针定义时,就必须带n个*。
      

  16.   

    呵呵,
    int *p=0;
    int a[4][5];
    p=a;
    应该是
    p=a[0];
    笔误笔误
    其实一定要那么写的话也行,不过要强制类型转换一下:p=(int *)a;
    因为p是个指向整形的指针,*a是的内容是行的地址,类型不匹配。你那种做法也对,不过定义的时候要小心些.
      

  17.   

    我感觉越来越清晰了,不过,我想搞得透一点,所以,麻烦请看:这么定义:
    int (*p)[4];//这么定义表示p是一个二级指针。
    int a[4][5];
    p=a;//这是对的。int **p=NULL;//p也是一个二级指针。
    int a[4][5];
    ……
    可能p=a吗?怎么做。是不是如果想让一个多维指针和多维数组联系在一起,非得这么定义:
    int (*a)[4];//二维
    int (*b)[4][5];//三维
    int (*c)[4][5][6];//四维而这样不行:
    int **a;
    int ***b;
    int ****c;
      

  18.   

    如果你想将多级指针和多维数组联系起来,可以直接使用数组名或按下面的形式声明多级指针:
    int (*a)[4];//二维
    int (*b)[4][5];//三维
    int (*c)[4][5][6];//四维
        我不建议你用下面的形式声明:
        int ****a;
        这种形式使程序不易读懂,而且极其容易出错, 除非特殊要求,例如寻址. 这种形式相当于 int a[1][1][1][1],所以无论你前面加多少个*,最终都只能指向一个元素.
      

  19.   

    还是没看懂~
    晕~
    谁能告诉我
    int* a[5]={1,2,3,4,5};
    int* p=a;
    p[2]=3;//这是哪里出来的东西?我怎么从来没见过?[]????