2012-04-21 96 views
0

予跨越程序传来:功能在C返回指针

int bags[5]={20,5,20,3,20}; 
int main() 
{ 
    int pos=5,*next(); 
    *next()=pos; //problem with this line(should give error :lvalue required) 
    printf("%d %d %d",pos,*next(),bags[0]); 
    return 0; 
} 
int *next() 
{ 
    int i; 
    for(i=0;i<5;i++) 
     if(bags[i]==20) 
      return (bags+i); 
    printf("error"); 
    exit(0); 
} 

输出到程序是5 20 5虽然我希望它是左值必需的。 任何人都可以告诉原因?

+0

不能在键盘上编译(http://codepad.org/98m9rEjj)。有问题的行确实给出了一个错误。你使用了什么编译器? – ugoren 2012-04-21 18:52:33

+0

@ugoren从每个句子中删除两个'*',这是一个形式化问题。 – MByD 2012-04-21 18:53:24

+0

此代码不是合法的C代码。第4行和第5行似乎有语法错误。 – ssteinberg 2012-04-21 18:53:29

回答

2

虽然next()没有左值*next()是,这是一个int,由返回值IF *的next()(which is an int in the bags`阵列)来寻址。

换句话说,虽然不能指定函数的返回值,但可以指定返回值指定的值。

+0

,@ ugoren --how can * next()是一个左值吗? * next()是函数调用,它返回地址(一个常量)..以及一个常量如何能左值 – Raj 2012-04-22 19:49:10

+0

* next()不会是一个int。它将是一个指向整数值的地址。 – Raj 2012-04-22 19:53:05

+0

不完全是* next()是下一个返回值指向的int变量。 – MByD 2012-04-22 20:24:47

2

next()不是左值,因为函数返回值不是。
*next()是一个左值,因为它的值包含在某个已知的内存地址中。无论该地址是作为函数的返回值还是以其他方式获得(例如,它存储在变量中),都无关紧要。

0

解除运算符*的结果是的左值。

“一元*运算符表示间接,如果它指向一个对象,结果是指定对象的左值。” C99 6.5.3.2/4