我对C++多维数组和指针的关系有些不太明白。

arfu 2000-06-12 12:20:00
以知: int a[3][4];

那么: a能不能表示为a[0][0] 的地址?
(我知道如果是一维数组a可以代表a[0]的地址)

a==&a[0][0]==&a[0] ???

a+1是&a[0][1],
a+2是&a[0][2],

a+3是&a[1][0],

a+4是&a[1][1],
... ...
a+11是&a[2][4],

但是:

a[0]是&a[0][0],
a[0]+1是&a[0][1],
a[0]+2是&a[0][2],

a[1]是&a[1][0],
a[1]+1是&a[1][1],
换句话说:
a+n(n能取0---11) ???
a[0]+n(n只能取0---2,n到2后,再往下就是 a[1]+1 了) ???

我上面的理解对不对,请高手详细说明。书中对此写的比较省略。
非常感谢
...全文
319 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2000-06-13
  • 打赏
  • 举报
回复
你的:
a==&a[0][0]==&a[0] ???
a+1是&a[0][1],
... ...
a+11是&a[2][4],
这些理解都是不对的。

ad 说得是对的。
a 不是直接指向a[0][0]处。
而是指向的一个一维地址指针数组起始处,即a[0];
这个一维数组再分别指向a[0][0],a[1][0],...

象x_q_y自己写程序看看的,你会明白的。
halfdream 2000-06-13
  • 打赏
  • 举报
回复
你的:
a==&a[0][0]==&a[0] ???
a+1是&a[0][1],
... ...
a+11是&a[2][4],
这些理解都是不对的。

ad 说得是对的。
a 不是直接指向a[0][0]处。
而是指向的一个一维地址指针数组起始处,即a[0];
这个一维数组再分别指向a[0][0],a[1][0],...

象x_q_y自己写程序看看的,你会明白的。
ad 2000-06-13
  • 打赏
  • 举报
回复
x_q_y说的中断是指设置断点,程序运行到那一行就暂停,这时可以观察一下变量的内容可地址等。
在C语言中,多维数组在内存中的排列按列优先,举例说,a[3][3]在内存中的排列是a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]....a[2][1]、a[2][2]。对于二维数组a[3][3],a[1][0]是指数组中的一个元素,a[1]是其中的一个分量,即a[1]是一个一维数组,a[1]的第一个元素是a[1][0],所以a[1]的地址是&a[1][0],没错,就象a的地址是&a[0][0]一样。
对于二维数组的操作不应该用a[1]+1之类的形式,这样做不规范,虽然编译没问题,例如
a[1][1] = 2;
也可以写成:
*(int *)(a[1]+1) = 2;
甚至可以这样写:
*(int *)(a + 4) = 2;
但这样没有实际意义,如果写成a[0][3],其实际指向的是a[1][1],编译不会报错,运行能得到正确结果,可见,C语言相当灵活,只要地址正确,写法并不重要,只是阅读的习惯而已,但好的风格总是使代码有利于阅读。
arfu 2000-06-13
  • 打赏
  • 举报
回复
谢谢halfdream, softdoctor & x_q_y,

我好象找到点感觉了,但还有点不明白,
例如

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

用 pirntf(" %d ") 输出

a=6684096
a[0]=6684096 //a和a[0]的地址数值一样

**a=1 //a好象是指向指针的指针,但又不是
*a[0]=1

*a != 1 为什么?
望各位不吝赐教,谢谢
softdoctor 2000-06-13
  • 打赏
  • 举报
回复
关键是要懂得数组的内存排列方式。
任何数组都是一片连续的内存,以字节为最小单位。
举例:
char a[1][2][3][4][5][6][7];

a数组是一片连续的内存,大小为1*2*3*4*5*6*7字节。
符号a代表这片内存的起始地址(指针),也是a[0][0][0][0][0][0][0][0]的地址。
a+1表示a[0][0][0][0][0][0][0][1]的地址,a+i表示的是
a[(i/7/6/5/4/3/2/1)][(i/7/6/5/4/3/2)%1][(i/7/6/5/4/3)%2][(i/7/6/5/4)%3][(i/7/6/5)%4][(i/7/6)%5][(i/7)%6][i%7]的地址。

数组a的含义:1*2*3*4*5*6*7个字符先分成1等份,每小份再分成2等份...每小份再分成7
等份。
a[0](字符)在内存里的长度是1BYTE,a+i(地址)在内存里的长度是4BYTE
OK
wedong2000 2000-06-12
  • 打赏
  • 举报
回复
关注
arfu 2000-06-12
  • 打赏
  • 举报
回复
我对中断不太了解,能不能说明白点。

谢谢
x_q_y 2000-06-12
  • 打赏
  • 举报
回复
编了一个程序
main()
{
int a[3][10];
return 0; //在此中断 得到下列地址列表,你看一下就明白了,你的理解前半部分是错误的
}

+ a 0x0065fd80
+ &a[0][0] 0x0065fd80

+ a+1 0x0065fda8
+ &a[1] 0x0065fda8

+ &a+1 0x0065fd81
+ &a[0]+1 0x0065fd81

+ &a+2 0x0065fd82
+ &a[0]+1 0x0065fd81


+ &a+3 0x0065fd83
+ &a+4 0x0065fd84

+ &a[0][1] 0x0065fd84

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧