多维数组和指针
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)