【问题标题】:functions returning pointers返回指针的函数
【发布时间】:2025-12-20 21:00:09
【问题描述】:

我在 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 虽然我预计它是需要的左值。 谁能说出原因???

【问题讨论】:

  • 无法在键盘中编译 (codepad.org/98m9rEjj)。有问题的行确实给出了错误。你用的是什么编译器?
  • @ugoren 从句子的每一侧删除两个*,这是一个格式问题。
  • 此代码不是合法的 C 代码。第 4 行和第 5 行似乎有语法错误。
  • @ssteinberg - 第 4 行是有效的函数声明,第 5 行 - 请参阅我之前的评论。
  • 这段代码没问题。 *(int 指针) = 5; //正常语法

标签: c


【解决方案1】:

虽然next() 不是左值,*next() 是,这是一个 int,由 *next()(which is an int in thebags` 数组的返回值寻址。

换句话说,虽然您不能分配给函数的返回值,但您可以分配给返回值所寻址的值。

【讨论】:

  • ,@ugoren - *next() 如何成为左值? *next() 是一个函数调用,它返回地址(一个常量)..常量怎么可能是左值
  • *next() 不会是 int。它将是一个指向整数值的地址。
  • 不完全是,*next()是next的返回值指向的int变量。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    解引用运算符*的结果一个左值。

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

    【讨论】: