首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

多维数组和指针解决思路

2012-02-11 
多维数组和指针intarr[2][3][5]int(*p)[5]arr[0]//(*p)[5]这个5代表什么???????int*qarr[0][0]//以上

多维数组和指针
int   arr[2][3][5];
int   (*p)[5]   =   arr[0];//(*p)[5]这个5代表什么???????
int   *q   =   arr[0][0];//以上两个指针分别指向了什么????????
printf( "arr   =   %x ",   arr);
printf( "初始p   =   %x\n         q   =   %x\n ",   p,   q);
p++;
q++;
printf( "p   =   %x\nq   =   %x\n ",   p,   q);
***********************************************************
上面的程序结果是:初始p   =   12ff08
                                          q   =   12ff08
                                  p   =   12ff1c
                                  q   =   12ff0c
这里理解还好
**********************************************************
然后arr数组改成arr[2][3][4],输出:初始p   =   12ff20
                                                                          q   =   12ff20
                                                                  p   =   12ff34
                                                                  q   =   12ff24
得到的偏移量和原来是一样的,本来按数组结构来推算应该是不一样的,越弄越糊涂了.

大侠指点啊~~~~~~~~~~~~~~

[解决办法]
int (*p)[5] 这声明一个指针数组,这个数组元素指向一个int[]类型的。
p=arr[0];这个把这个指针数组指向了arr[0],也就是arr这个地址。
比如
内存地址:000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
假如arr=000;
那么arr[0]=000,p也等于000
arr[0]=000,arr[1]=015
arr[0][0]=000,arr[0][1]=050,arr[0][2]=010,arr[1][0]=015...
arr[0][0][0]=000,arr[0][0][1]=001...

这样就有p[0]=000,p[1]==005,p[2]=010,p[3]=015,p[4]=020,p[5]=025,p[6]=030.....
而由于p是指针,所以用p可以越界访问
比如: p[0][10]=100;这是完全合法的。这样做以后p[2][0]和arr[0][2][0]也就变成100去了。

哎呀头晕,下面是我调试的代码,个人在VC6 去跟踪下就晓得了。
int main()
{
int arr[2][3][5];
int i,*ip;
ip=arr[0][0];
for(i=0;i <30;i++)
{
*ip=i;
ip++;
}
int test[5]={1,2,3,4,5};
int (*p)[5] = arr[0];//(*p)[5]这个5代表什么???????
int *q = arr[0][0];//以上两个指针分别指向了什么????????
p[0][10]=100;
*(p+(10*sizeof(int)))[0]=100;
*p[1]=test[1];

printf( "arr = %x ", arr);
printf( "初始p = %x\n q = %x\n ", p, q);
p++;
q++;
printf( "p = %x\nq = %x\n ", p, q);
return 0;
}
[解决办法]
#include <iostream>
#include <string>

using namespace std;

void main()
{
int arr[2][3][5];
int *linearray=(int*)arr;
for(int i=0;i <30;i++)
linearray[i]=i;
int *shownum1=(int *)arr[1];
int *shownum2=(int *)arr[0][1];
int *shownum3=&arr[0][0][0];


int (*shownum)[5]=arr[0];
printf( "%d \t%d \t%d\t%d\n ",*shownum1,*shownum2,*shownum3,*shownum[0]);

shownum1++;
shownum2++;
shownum++;

printf( "%d \t%d \t%d\t%d\n ",*shownum1,*shownum2,*shownum3,*shownum[0]);

}

you can know how it works
[解决办法]
int (*p)[5] = arr[0];//(*p)[5] p指向行头,5是每一行具有的int数
int *q = arr[0][0];// 指向第零行第零列的第零个元素

p++ ===〉 p = 0x12ff20 + 5*4 = 0x12ff34
q++ ===> q = 0x12ff20 + 4 = 0x12ff24

与5有关,p和q与arr没有关系,arr只是提供一个起始地址
[解决办法]
记住一条,指针++偏移量运算是根据指针声明所指类型大小来计算的,因此
int (*p)[5];
p++ 等价于p的值 + sizeof(int[5])
int *p;
p++ 等价于p的值 + sizeof(int)

热点排行