社区
C语言
帖子详情
*(*(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
打赏
收藏
*(*(p+i)+j)的问题
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行的首元素值了?,就不是地址了, 结果最外面还有个*,怎么理解?
复制链接
扫一扫
分享
转发到动态
举报
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,这个名字退化成指针,然后做偏移,然后再* 解引用
C语言学习之指针 *p++、*(p++)、(*p)++
总结 *p++与*(p++)是等价的,该表达式返回*p,即p表示的地址所存的数据,并且指针p自增1 (*p)++ 该表达式返回*p,即p表示的地址所存的数据,然后该数据自增1 C编译器认为*和++是同优先级操作符,且都是从右至左结合的,所以*p++中的++只作用在p上,和*(p++)意思一样;在(*p)++中,由于()的优先级比*和++都高,所以++作用在()内的表达式*p上。 #include <stdio.h> int main(){ int a[] = {1, 2,...
*p++和(*p)++区别
现在写代码比较少,*p++和(*p)++有些混淆,记录下以便以后用到: *p++等价于*(p++):先取值再p后移??很多人错误地认为是先执行*p, 然后执行p++,结果看起来像是这样子的,不过这么理解是不对的。原因是*和++的优先级相同,它们是右结合方式,实际上先执行p++,因为是后置++,p++返回的还是原来p指向的位置,等执行完解指针*p后,指针p才后移的。例如 int j = i++; ...
c语言(p i),【C语言】*(p+i) [j] 和 (*(p+i))[j] 的区别
问题
。万分感谢!!
满意答案fhxzz2013.09.10采纳率:49%等级:12已帮助:7395人*(p+i) [j]分两步1.tmp = (p+i)[j2.return *tmp(*(p+i))[j] 的两步1. tmp = *(p+i)2. return tmp[j]具体举例来说int a[5] = {1, 2, 3, 4, 5};int *p = a;int i = 1, j = 2;则*(p+i) ...
12、关于*(p+i) [j] 和 (*(p+i))[j] 的区别
今天遇到了这样一道题目: 若有一下定义: int w[2][3]; 则对w数组元素非法引用是: A、*(w[0]+2) B、*(w+1)[2] C、w[0][0] D、*(w[1]+2) E、w[1]+2 题目不难,我一开始直接选了E,因为这是对w数组元素的非法引用,单单给个地址肯定是不对的,可是后面一听讲解才知道,E是正确的,但B选项的值越界了,这就...
c语言字符串复制while,为什么while (*s++ = *t++);这句代码的作用是复制字符串?...
1、为什么while (*s++ = *t++);这句代码的作用是复制字符串? 测试代码如上,可以这么理解:1)、a = *t++;表示a = *t;接着++t;同理,*s++ = a;表示*s = a;之后++s;所以*s++ = *t++;等价于,a = *t;++t;*s = a;++s;所以上面的语句每执行一次,便把当前*t的值赋给*s,接着地址t和s前移一位。因此利用while循环即可...
C语言
70,017
社区成员
243,265
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章