结构体指针 +1的疑惑

下面的语句摘自“C和指针”:px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨... 下面的语句摘自“C和指针”:

px+1的右值:如果px指向一个结构数组的元素,这个表达式将指向该数组的下一个结构。但,就算如此,这个表达式任然是非法的,因为我们没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西。
c prime plus 里明确说明类似px+1的操作将指向该数组的下一个结构。自己试验也说明类似px+1是可以的。难道“C和指针”错了么?还是特定情况下没有办法分辨内存下一个位置所存储的是这些结构元素之一还是其他东西?
谢谢缪立军,你的意思是说数组越界么?如果不越界什么情况下会出现下一个位置是其它类型的变量?
展开
 我来答
若舞飘逸
推荐于2018-03-23 · TA获得超过10.5万个赞
知道大有可为答主
回答量:1.5万
采纳率:81%
帮助的人:3937万
展开全部
如果px+1的下一个地址仍然是该结构体的变量实例,那么应该不会出错,如果下一个位置是其它类型的变量,应该就会报错,“C和指针”里说的应该是这个意思。“c prime plus”里面应该是默认了下一个位置还是这种结构体的变量.

结构
(1) [structure]∶组成整体的各部分的搭配和安排
经济结构
(2) [fabric]∶建筑物承重部分的构造
复合结构
(3) [build]∶构筑;建造
(4) [collude with]∶勾结
Sievers分析仪
2024-10-13 广告
是的。传统上,对于符合要求的内毒素检测,最终用户必须从标准内毒素库存瓶中构建至少一式两份三点标准曲线;必须有重复的阴性控制;每个样品和PPC必须一式两份。有了Sievers Eclipse内毒素检测仪,这些步骤可以通过使用预嵌入的内毒素标准... 点击进入详情页
本回答由Sievers分析仪提供
缪立军
2013-05-12 · TA获得超过384个赞
知道小有建树答主
回答量:257
采纳率:100%
帮助的人:170万
展开全部
应该说的都没错
如果px+1的下一个地址仍然是该结构体的变量实例,那么应该不会出错,如果下一个位置是其它类型的变量,应该就会报错,“C和指针”里说的应该是这个意思。“c prime plus”里面应该是默认了下一个位置还是这种结构体的变量
追问
谢谢缪立军,你的意思是说数组越界么?如果不越界什么情况下会出现下一个位置是其它类型的变量?
追答
在vc中试验了一下,不越界是完全可以操作的,越界了程序不会报错,指向的还是该类型的结构体,只是它的变量没有初始化,如果前面对越界的结构体变量进行初始化,还是可以正常拿到结果。
#include "stdio.h"
struct test
{
char x;
char y;
};
void main()
{
test* t;
test* h;
test* y = new test[2];
y[1].x = '3';
y[2].x = '4';
printf("%c %c %c %c\n",y->x,(y+1)->x,(y+2)->x,(y+3)->x);
}
这段程序的输出是
? 3 4 ?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cossbow
2013-05-12 · TA获得超过697个赞
知道小有建树答主
回答量:798
采纳率:100%
帮助的人:220万
展开全部
理解字面意思太烦了,不过可以这样说:
Type *px; Type是数据类型,可以是结构体等
px+1表示px移动sizeof(Type)个字节的内存地址
移动这些位置后是什么地方,需要程序员明白,自己检查是否越界,
比如char是一个字节,int是4字节,你可以调试这样的代码:
char *p;
int a=123456789;
p=(char*)&a;
printf("%c,%c,%c,%c/n",p[0],p[1],p[2],p[3]);
追问
觉得这里说的“不合法”并不是越界情况,见C和指针第六章关于指针的详细论述。另外注意此处“是这些结构元素之一还是其他东西?”而不是说是不是数组元素。强调的是“结构元素之一”。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郝在益
2013-05-12 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:621万
展开全部
“但,就算如此,这个表达式任然是非法的”,这句话的意思是说,你不知道这个数组有多少个成员,如果,px所指向的是数组中最后的一个结构体,那么,px+1就是非法的了。因为你根本就没有为程序申请这段内存。因为不确定性,所以归结为不合理中。
更多追问追答
追问
觉得这里说的“不合法”并不是越界情况,见C和指针第六章关于指针的详细论述。另外注意此处“是这些结构元素之一还是其他东西?”而不是说是不是数组元素。强调的是“结构元素之一”。
追答
有时候我真的发现无法和你们有效的交流,你们看别人回答的时候,也请你们思考思考,别人为什么这样回答你,还有,有些东西,你以为是2个不同的,但是实际上他们就是一个东西,只是叫法不一样而已。在我看来你的问题就只有一个意思。
我建议你还是看一下专业的,关于c语言程序的内存方面的书籍。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2019-04-28
知道答主
回答量:1
采纳率:0%
帮助的人:740
展开全部
px+1本身没有问题,但是px+1作为左值是非法的。px可以作为左值,但是px+1不可以。如果int a=10,b=15,*px=&a,如果a地址为2000H,那么px存放的值为2000H,那么px+1就表示2004H,如果有这样一个式子px+1=&a,这样合法吗?这与a+1=b在一定程度上是等价的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式