社区
C语言
帖子详情
指针。。。
nanbazhangbiao
2011-03-29 09:59:09
今天朋友一个怪怪的表示,p是一个指针。p[-1]是指什么?
如果char *p="abcde";是不是把p移到e时,p[-1]==d?
...全文
142
11
打赏
收藏
指针。。。
今天朋友一个怪怪的表示,p是一个指针。p[-1]是指什么? 如果char *p="abcde";是不是把p移到e时,p[-1]==d?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
额。。谢谢各位的解答。。
C/C++
指针
经典资料大全
C/C++
指针
经典资料大全,十余部经典资料书籍,是您精通C
指针
的理想教程。
C/C++
指针
的13份资料
C/C++
指针
的13份资料 内容丰富,让编程人员不再害怕
指针
C++ 11 14 17 20内存管理-
指针
、智能
指针
和内存池
课程简介C++ 11 14 17 20内存管理-
指针
、智能
指针
和内存池从基础到实战学习计划1. 每天学习一小时以上2. 跟着视频动手编写代码3. 调试代码并对比课程多提供的源码课程目标1. 理解
指针
原理并学会智能
指针
和编程2. 理解c++17内存池技术3. 理解c++11 14 17 20 内存相关特性4. 拥有应用智能
指针
和内存池的实战的能力
数组
指针
和
指针
数组
首先,理解一下数组
指针
和
指针
数组这两个名词: “数组
指针
”和“
指针
数组”,只要在名词中间加上“的”字,就知道中心了—— 数组的
指针
:是一个
指针
,什么样的
指针
呢?指向数组的
指针
。
指针
的数组:是一个数组,什么样的数组呢?装着
指针
的数组。 然后,需要明确一个优先级顺序:()>[]>*,所以: (*p)[n]:根据优先级,先看括号内,则p是一个
指针
,这个
指针
指向一个一维数组,数组长...
深入理解C语言
指针
一、
指针
的概念 要知道
指针
的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为
指针
,就像酒店的门牌号一样。 1.1、变量和地址 先写一段简单的代码: void main(){ int x = 10, int y = 20; } 这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章