error C2102: '&' requires l-value

yourcarol 2005-04-19 09:11:36
#include <stdio.h>
//#include <iostream>
struct User
{
char name[9];
int age;
};

void main()
{
struct User *a;
unsigned long i = &(unsigned long)a;
printf("%l",i);

}
就是这个东东,找了很长时间没有看到解决的方法;
请师兄们帮忙看看!
谢谢!

...全文
1290 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAA235 2005-07-19
  • 打赏
  • 举报
回复
你在MFC中编译肯定不能通过,会报error c2102: requires l-value
yourcarol 2005-04-20
  • 打赏
  • 举报
回复
这里想请搂主解释一下右值的概念!
谢谢!
yourcarol 2005-04-20
  • 打赏
  • 举报
回复
我看的是发表在VC知识库的在线杂志第27期上面的一文章:
//http://www.vckbase.com/vckbase/index2.html
//可以在这里下载;
大型作业答辩:C/S考试系统程序制作详解;
这个是定义的结构:
struct ContextKey
{
SOCKET sock;
char InBuffer[4];
OVERLAPPED ovIn;
int nOutBufIndex;
char OutBuffer[MAXLINE];
OVERLAPPED ovOut;
DWORD dwWritten;
};
struct ContextKey *pCntx;

UNREFERENCED_PARAMETER(pVoid);

bResult = GetQueuedCompletionStatus(
ghCompletionPort,
&dwNumRead,
&(DWORD)pCntx,
&lpOverlapped,
INFINITE
);

在GetQueuedCompletionStatu()函数中的为什么第三个参数可以编译通过,但是我写的就不可以!
我和同事百思不得其解,所有的设定也都看了,为什么原理上不可行的东西却偏偏可以编译通过!
不知道是哪里出了问题?
还请大家一起探讨一下!
fjjfxz 2005-04-20
  • 打赏
  • 举报
回复
左值表达式就是可以出现在赋值号左边的式子,即有地址,代表着某一内存单元。
右值表达式就是只能出现在赋值号右边的式子,当然,左值同时也可以是一个右值表达式
Maxwell 2005-04-19
  • 打赏
  • 举报
回复
你应该把&放到a的前面,先把a的地址取出来,然后把这个地址转换成unsigned long。
要打印地址不是有个%p吗,用那个比这样方便。
zengwujun 2005-04-19
  • 打赏
  • 举报
回复
struct User *a;
unsigned long i = (unsigned long)(&a);
printf("%ld",i);
kobefly 2005-04-19
  • 打赏
  • 举报
回复
回复人: yourcarol(闪光的美学) ( ) 信誉:100 2005-04-19 09:55:00 得分: 0


a实际上是一个地址,我这里只是将它转换为了unsigned long类型,然后去地址的地址;
从头看过来;我定义了一个结构,然后用它声明了一个变量;用一个指针a指向他,然后在取这个指针的地址,是不是这个指针a的地址由问题!
这样有什么问题?
我看到一个强人这样做了!
但是我写就有问题!
上google去搜索都是外文的!


呵呵
你的想法没有错,但是
你可以
unsigned long i = &a;
你却不可以
unsigned long i = &(unsigned long)a;
为什么?
因为unsigned long)a是将a转换为一个unsigned long,结果放在哪里呢?
是a中吗,不是,a的值并不会变,所以只能存放在一个临时变量中
临时变量的地址可以确定吗?

不可以
所以
你的操作就不ok了
zhangfjj 2005-04-19
  • 打赏
  • 举报
回复
问题是
&(unsigned long)a ===>相当于
&((unsigned long)a)也就是把地址转换为unsigned long,此时它是一个值了
就是取出a的值,转换为一个unsigned long,并不是直接改变a的属性
就如:float x=3.5;
(int)x 即取出x的值3.5,转化为int,即值为3,但x并不变
int main()
{
float x=3.5;
int y;
y=(int)x;
cout<<"y="<<y<<",x="<<x<<endl;
return 0;
}
yourcarol 2005-04-19
  • 打赏
  • 举报
回复
a实际上是一个地址,我这里只是将它转换为了unsigned long类型,然后去地址的地址;
从头看过来;我定义了一个结构,然后用它声明了一个变量;用一个指针a指向他,然后在取这个指针的地址,是不是这个指针a的地址由问题!
这样有什么问题?
我看到一个强人这样做了!
但是我写就有问题!
上google去搜索都是外文的!
junmayang 2005-04-19
  • 打赏
  • 举报
回复
&只能对左值表达式求值
晨星 2005-04-19
  • 打赏
  • 举报
回复
哦,新版主就是高!
zhangfjj 2005-04-19
  • 打赏
  • 举报
回复
&只能对左值表达式求地址
(unsigned long)a经强制转换后成了一个右值
dongpy 2005-04-19
  • 打赏
  • 举报
回复
unsigned long i = &(unsigned long)a;
=======================
(unsigned long)a强制转换,产生unsigned long类型的临时变量,临时变量不能取地址。

69,377

社区成员

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

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