*(*(p+i)+j)的问题

xitijie 2011-07-12 01:20:55
int a[3][3]
int (*p)[3]
p=a

我想问:1,如果定义int *p,那么p=a是错的,因为a是地址的地址,怎么理解?
2,*(*(p+i)+j),p+i是第i行的首地址,那么*(p+i)不就是第i行的首元素值了?,就不是地址了,
结果最外面还有个*,怎么理解?
...全文
2518 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
duchenhi 2011-07-12
  • 打赏
  • 举报
回复
int a[3][3]
int (*p)[3]
p=a

1,如果定义int *p,那么p=a是错的,因为a是地址的地址,怎么理解?
其实,int *p; p=(int*)a; 就对了。你会发现p[8] == a[2][2].其实c里面的指针都可以强转的.

2,*(*(p+i)+j),p+i是第i行的首地址,那么*(p+i)不就是第i行的首元素值了?,就不是地址了,
结果最外面还有个*,怎么理解?
你应该理解成p+i是第i个数组的地址.
Gary_Hendrix 2011-07-12
  • 打赏
  • 举报
回复
p是个指针数组,当然可以
赵4老师 2011-07-12
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
gskuan 2011-07-12
  • 打赏
  • 举报
回复 1
[Quote=引用 9 楼 jxiaoshen 的回复:]
1:
a为二位数组的首地址,不能从int[][]转化为int *,类型不匹配
2:
p+i:是第i行的首地址。
*(p+i)是第i行第0列元素的地址。与p+i等效,也与p[i],&p[i][0]等效
*(p+i)+j是第i行第j列元素的地址。
*(*(p+i)+j)是第i行第j列元素所对应的值。
[/Quote]
写的很好
Jxiaoshen 2011-07-12
  • 打赏
  • 举报
回复
1:
a为二位数组的首地址,不能从int[][]转化为int *,类型不匹配
2:
p+i:是第i行的首地址。
*(p+i)是第i行第0列元素的地址。与p+i等效,也与p[i],&p[i][0]等效
*(p+i)+j是第i行第j列元素的地址。
*(*(p+i)+j)是第i行第j列元素所对应的值。



maeom 2011-07-12
  • 打赏
  • 举报
回复 1
我想问:1,如果定义int *p,那么p=a是错的,因为a是地址的地址,怎么理解?

a可以看成是:指向指针的指针
p是:指向int型的指针。

2,*(*(p+i)+j),p+i是第i行的首地址,那么*(p+i)不就是第i行的首元素值了?,就不是地址了,
结果最外面还有个*,怎么理解?

这里的p就是指向指针的指针了。 所以 *(p+i)所指向的还是个指针,而不是二维数组中实际的数据。(如果你存的就是指针的情况例外)
zyc_glboy 2011-07-12
  • 打赏
  • 举报
回复
1、a代表了一个二维数组,它不能直接转化成int *。
2、p是指向数组的指针,p+i表示第i个数组,(*(p+i)+j)表示第i个数组的第j个元素。
至善者善之敌 2011-07-12
  • 打赏
  • 举报
回复 1
[Quote=引用 1 楼 luciferisnotsatan 的回复:]
int (*p)[3] 数组指针,指向的元素是一个含有3个int的数组。
*(p+i) 解出来的值就是3个int的数组。然后+j,相当于 int arr[3]; arr+2,这个名字退化成指针,然后做偏移,然后再* 解引用
[/Quote]

实际上是对二维数组的解引用
pathuang68 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luciferisnotsatan 的回复:]

int (*p)[3] 数组指针,指向的元素是一个含有3个int的数组。
*(p+i) 解出来的值就是3个int的数组。然后+j,相当于 int arr[3]; arr+2,这个名字退化成指针,然后做偏移,然后再* 解引用
[/Quote]

++
xitijie 2011-07-12
  • 打赏
  • 举报
回复
这个好像是有2级的样子,是这样吗?
xitijie 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

p=a可以
p的元素是指针,*(p+i)取出的还是值,然后在一个*,才取到那个指针元素的内容
[/Quote]

P的元素是指针?什么意思?P+i不就是地址吗,加*了,不就是那个元素值了?

能解释详细点吗?很困扰。。。。
bdmh 2011-07-12
  • 打赏
  • 举报
回复
p=a可以
p的元素是指针,*(p+i)取出的还是值,然后在一个*,才取到那个指针元素的内容
luciferisnotsatan 2011-07-12
  • 打赏
  • 举报
回复
int (*p)[3] 数组指针,指向的元素是一个含有3个int的数组。
*(p+i) 解出来的值就是3个int的数组。然后+j,相当于 int arr[3]; arr+2,这个名字退化成指针,然后做偏移,然后再* 解引用

70,017

社区成员

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

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