指针。。。

nanbazhangbiao 2011-03-29 09:59:09
今天朋友一个怪怪的表示,p是一个指针。p[-1]是指什么?
如果char *p="abcde";是不是把p移到e时,p[-1]==d?
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
驴被脑袋踢了 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 svtanto 的回复:]
p[-1] 表达式中,[]是下标运算符,解析以后的意思是基数+偏移
p[-1] = p的地址向左偏移p的元素的大小,假设内存布局左边是小地址,右边是大地址
p[1] = p的地址向右偏移p的元素的大小,假设内存布局左边是小地址,右边是大地址
转换成代数式就是:
p[-1] = p + (-1)
p[ 1] = P + 1
注意:代数式可以交换,所以以下写法是对的
p[-1] = (-……
[/Quote]
p[-1] = p + (-1) 这个不对吧,p[-1] = *(p + (-1))
pathuang68 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nanbazhangbiao 的回复:]

那有没有p[-2]、p[-3]这种表达?
[/Quote]
有的。在类的virtual继承时,编译器就会用到负指针。
svtanto 2011-03-29
  • 打赏
  • 举报
回复
p[-1] 表达式中,[]是下标运算符,解析以后的意思是基数+偏移
p[-1] = p的地址向左偏移p的元素的大小,假设内存布局左边是小地址,右边是大地址
p[1] = p的地址向右偏移p的元素的大小,假设内存布局左边是小地址,右边是大地址
转换成代数式就是:
p[-1] = p + (-1)
p[ 1] = P + 1
注意:代数式可以交换,所以以下写法是对的
p[-1] = (-1)[p]
p[ 1] = 1[p]
看起来有点怪,但是没有问题。


赵4老师 2011-03-29
  • 打赏
  • 举报
回复
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=&a[5];
printf("%d,%d,%d\n",p[0],p[-1],p[-2]);

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
nanbazhangbiao 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 laier903 的回复:]
是的,假如你没有移动p,p指向的是首地址,那么p[-1]就是为空。
[/Quote]

那如果是p没有移动,p[-2]指向什么?不可预测?
jialejiahi 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengxuxing 的回复:]

那有没有p[-2]、p[-3]这种表达?
。。。。。。。。
有,只是大多数人不怎么用
p[-2]、p[-3]和p-2,p-3其实是一个意思
[/Quote]
纠正下 p[-2]相当于*(p-2)
lovesi3344 2011-03-29
  • 打赏
  • 举报
回复
从本质上讲 [] 运算符是一个地址运算符, 它执行运算相当于:
数组首地址 + []内的数值 * sizeof(数组类型)
Qlaiaqu 2011-03-29
  • 打赏
  • 举报
回复
那有没有p[-2]、p[-3]这种表达?
。。。。。。。。
有,只是大多数人不怎么用
p[-2]、p[-3]和p-2,p-3其实是一个意思
nanbazhangbiao 2011-03-29
  • 打赏
  • 举报
回复
那有没有p[-2]、p[-3]这种表达?
LAIER903 2011-03-29
  • 打赏
  • 举报
回复
是的,假如你没有移动p,p指向的是首地址,那么p[-1]就是为空。
nanbazhangbiao 2011-03-29
  • 打赏
  • 举报
回复
额。。谢谢各位的解答。。

69,382

社区成员

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

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