把二维数组看成一维数组的小问题

wit2188 2007-05-11 04:27:48
表达式*(指针变量+i)中,指针变量指向二维数组首地址,通过此式可算得二维数组中第i行对应的一维数组首地址。很奇怪这个表达式的结果是一个地址,何人能解?
...全文
669 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wit2188 2007-09-12
  • 打赏
  • 举报
回复
回复?
wit2188 2007-09-12
  • 打赏
  • 举报
回复
"a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址,也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。"
a是数组名,也就是地址,*a应该是二维数组首元素,怎么会与a[0]等效,也是一个地址呢?
stecdeng 2007-05-14
  • 打赏
  • 举报
回复 1
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
设数组a的首地址为1000
C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。
a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址,也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。&a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。
************************************
你的问题
*(指针变量+i)中,指针变量是地址,加了i后仍是地址(正确 指针变量是地址 ,他的内容也是地址,记录内容为地址的内存的地址)
*(指针变量+i)按道理应该得到一个什么值,但不是地址(错 你凭什么认为*(指针变量+i)他不是地址呢? 他的内容就是地址)
指针变量指向这一行的首单元,加了i后,不过是往后移(指针变量的类型不同,加i移动的地址不同。)
stecdeng 2007-05-14
  • 打赏
  • 举报
回复
二维数组看成二重指针
然后
yuaijuan() 写得很明白了
因该这样解释吧!
*(指针变量+i)表示的是二维数组的第i行的地址,
**(指针变量+i)表示二维数组的第i行的地址的第一个元素值,
*(指针变量+i)+j表示二维数组的第i行第j列的值,
*(*(指针变量+i)+j)表示二维数组的第i行第j列的值。

其实还是一维数组没好好理解透彻的原因
wit2188 2007-05-14
  • 打赏
  • 举报
回复
*(指针变量+i)按道理应该得到一个什么值,但不是地址,要想得到地址,(指针变量+i)所指向的空间里存放的也要是地址才行。二维数组在内存中的空间其实还是一行,指针变量指向这一行的首单元,加了i后,不过是往后移,指向另一个单元,这个单元里放的怎么会是地址呢,实在无法想象。
我的困惑已经说得很清楚了,不知有没有人明白?
hjon 2007-05-11
  • 打赏
  • 举报
回复
假设二维数组用array来表示,例如:int array[3][3];
想像一下取第i行第j列的元素怎么取?即array[i][j],
那么再考虑一下array[i]表示什么?在这时候把array当成一维数组看,其实这个表达式跟*(array+i)是一样的,在二维数组中也是一个道理.

所以在你的例子中,*(指针变量+i)相当于"指针变量[i]",在二维数组里就表示一个地址.
yuaijuan 2007-05-11
  • 打赏
  • 举报
回复
因该这样解释吧!
*(指针变量+i)表示的是二维数组的第i行的地址,
**(指针变量+i)表示二维数组的第i行的地址的第一个元素值,
*(指针变量+i)+j表示二维数组的第i行第j列的值,
*(*(指针变量+i)+j)表示二维数组的第i行第j列的值。
wit2188 2007-05-11
  • 打赏
  • 举报
回复
老谭的书也许讲得真的很清楚,可我不解,既然您理解了,能否好好解释解释?
ho_ccssddnn 2007-05-11
  • 打赏
  • 举报
回复
*(指针变量+i)本来就是表示二维数组第i行的首地址的,**(指针变量+i)才是表示第i行第0个元素的内容
lastday2 2007-05-11
  • 打赏
  • 举报
回复
(指针变量+i)是一指针,其指向某一地址,加上*就是地址值
ayw215 2007-05-11
  • 打赏
  • 举报
回复
老谭的书讲的已经很清楚了
P6689 2007-05-11
  • 打赏
  • 举报
回复
**(指针变量+i)才对. *(指针变量+i)表示指针。
yulin11 2007-05-11
  • 打赏
  • 举报
回复
需要算法源代码的到
算法源码吧 http://www.sfcode.cn/
wit2188 2007-05-11
  • 打赏
  • 举报
回复
诸位都解释的头头是道,可我还是不解,*(指针变量+i)中,指针变量是地址,加了i后仍是地址,‘*’运算符是干什么的,取内容的,*(指针变量+i)怎么就得到一个地址呢,我不知诸位是怎么想象出来的,反正我想象不出来。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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