读书人

求教如何用指向二维数组的指针

发布时间: 2012-04-03 12:38:19 作者: rapoo

求教,怎么用指向二维数组的指针。
// Dynimicarry.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>




int _tmain(int argc, _TCHAR* argv[])
{
double aas[2][2] = {1,2,3,4} ;
double a[3] = {1,2,3} ;

double *ppt = a ;
double **pt = (double **)aas ;

ppt[2] = 25 ;
pt[0][1] = 0 ; //pt指向的地址跟ass的地址一致的,为什么这里不能访问而上面的一维数组却可以
// 他们之间的区别在哪里
//而如果ass数组是用new来创建的话这样子访问没有问题
//那指向二维数组的指针该怎么用呢


system("pause") ;
return 0;
}







[解决办法]
http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html?10022先看看这个帖子之后再说吧
[解决办法]
c/c++中的数组可以看成是数组的数组(数组的名字是数组首元素的地址)...如int a[3][4];
是一个二位的数组,但是你可以看成一维的数组,有三个元素,a[0]
a[1],a[2],但是每一个元素是一个素数,如:a[0]有四个元素:a[0][0],
a[0][1],a[0][2],a[0][3],所以a是一个指向数组的指针,a + 1 则移动的是一行,
如果int类型是4个字节的话,那个实际移到是a + (1 * 4 * 4);
你只要理解上面说的,你就要想了怎么声明一个指向数组的指针了,
声明是:int (*p)[4]; p = a;中括号中的4表示的p是指向一个含有四个元素的数组,也就是指向数组的指针。其它多维的类推就可以了,如int b[2][2][2];int (*p)[2][2];
p = b;

[解决办法]
double **pt;
pt[0][1] 等价于 *(*(pt+0) + 1)
pt[0] 的时候 编译器不知道你的指针 步进多少

aas[2][2] 等价于 *(*(ass+2)+2)
假定ass实际指向 0x0000
ass[2] *(ass+2)编译器知道最后一维是 2 ass的类型为 ass*[2]
于是 *(ass + 2) = *(0x0000 + 2 * 2*sizeof(int) )
= *(0x0000 + 2*2*4) = *(0x0010) = 0x0010 指针的类型变化为 int*
*(*(ass+2)+2)
= *(*(0x0010)+2) = *(0x0012)

读书人网 >C++

热点推荐