| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 888 人关注过本帖
标题:C指针的传递问题
只看楼主 加入收藏
qingke
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2011-2-24
收藏
得分:0 
回复 2楼 犬虫门心
p0=p;
p=(p+1);
(p+1)=p0;
后面的这种写法就出现错误 error C2106: “=”: 左操作数必须为左值
在(p+1)=p0那行的样子
2011-02-24 21:04
丞相杀手
Rank: 6Rank: 6
等 级:侠之大者
帖 子:203
专家分:462
注 册:2011-1-11
收藏
得分:0 
回复 楼主 qingke
问题的关键在于 “=”这个运算符的 左操作数 必须是在你程序中声明过的变量(指针也是变量),你的 (p+1) 是你自己写的表达式,是不能作为那个背赋值的对象的

斗不过疯子,不参与争论。
2011-02-24 21:22
丞相杀手
Rank: 6Rank: 6
等 级:侠之大者
帖 子:203
专家分:462
注 册:2011-1-11
收藏
得分:10 
p0=p;
p=(p+1);
(p+1)=p0;

你要注意一个语义的问题,不管p指向什么地址,p+1永远是指向p地址之后的地址

现在看你在程序中做了什么
p0 = 0;//设置中间变量,没有问题
p = p + 1; //将p指向的地址向后移动没有问题
(p+1)=p0; // 这个貌似要改变语义,计算机办不到

斗不过疯子,不参与争论。
2011-02-24 21:33
qingke
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2011-2-24
收藏
得分:0 
回复 12楼 丞相杀手
明白了,谢谢!
但是我用

    *p0=*p;
    *p=*(p+1);
    *(p+1)=*p0;
这样的话
*(p+1)之前也是没有声明,但是用VS2010编译没有出现语法错误
2011-02-24 21:40
丞相杀手
Rank: 6Rank: 6
等 级:侠之大者
帖 子:203
专家分:462
注 册:2011-1-11
收藏
得分:0 
以下是引用qingke在2011-2-24 21:40:35的发言:

明白了,谢谢!
但是我用

    *p0=*p;
    *p=*(p+1);
    *(p+1)=*p0;
这样的话
*(p+1)之前也是没有声明,但是用VS2010编译没有出现语法错误


这样语法上是没有问题,不过尽量还不要这样用,使用指针引用未声明的内存地址是很容易出问题的(因为编译器不检查这样的错误),如果p+1指向的地址是另外一个变量的地址,那样的话,程序可能会崩溃的

[ 本帖最后由 丞相杀手 于 2011-2-24 22:15 编辑 ]

斗不过疯子,不参与争论。
2011-02-24 21:59
qingke
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2011-2-24
收藏
得分:0 
回复 15楼 丞相杀手
p0=0;
 p1=0;
······
p1=(p+1);
p0=p;
p=(p+1);
p1=p0;
加上一个p1
然后这样就没问题了吧
不过这样还是没达到我想要的交换p跟p+1的值
而一旦我使用
struct student *p;
p=stu  //stu是我已经定义的一个结构体数组名
 p0=0;
 p1=0;
*p1=*(p+1);
*p0=*p;
*p=*(p+1);
*p1=*p0;
虽然程序可以编译但是在运行的时候当运行到*p1=*(p+1);这一步的时候系统就会提示内存冲突
我已经给p1赋值了,但是为什么还是会出问题呢?
其中p是指向一个结构体数组的首位,那p+1应该是指向stu[1]的,那这样子p1指向的内容应该是stu[1]的内容,可是运行的时候为什么p1是错误的指针呢?

[ 本帖最后由 qingke 于 2011-2-24 22:37 编辑 ]
2011-02-24 22:27
快速回复:C指针的传递问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025482 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved