【问题标题】:Call by reference behavior when calling by value按值调用时按引用调用的行为
【发布时间】:2019-08-23 00:07:33
【问题描述】:

我正在阅读 K&R C 书的第 1.9 章,但我并不完全理解给出的示例代码。其中有一个函数getline(line, MAXLINE),它返回一个行长的int。

然而,紧接着,'line' 变量被使用。根据我对函数的理解,不应修改 line 变量,C 只是将lineMAXLINE 传递给函数,函数返回一行的长度。这看起来像一个传递引用函数,但代码是传递值函数。

任何帮助将不胜感激。

我删除了 K&R 书中的大部分原始代码以试图更好地理解它,但它仍然让我感到困惑。

#define MAXLINE 1000
int getLine(char, int);

int main(){
    char line[MAXLINE];
    int len;

    printf("%s\n", line);         //making sure that there is nothing in line
    len = getline(line, MAXLINE); 
    printf("length: %d\n", len);  
    printf("%s", line);           //now there's something in line!?

    return 0;
}

int getline(char s[],int lim)
{
    int c, i;
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

【问题讨论】:

  • 代码通过值传递一个指针(使用不直观的语法),然后你可以使用这个指针来修改数组。本书将在某个阶段对此进行解释
  • 数组在传递给函数时衰减为指针——指向第一个元素的指针被传递给函数。
  • 最简洁的表达方式是注意指针的值一个引用

标签: c kernighan-and-ritchie


【解决方案1】:

int getline(char s[], int lim) 等价于int getline(char *s, int lim)

也就是说s是一个指针,指向内存中存储char line[MAXLINE]的位置,所以通过修改s的内容,实际上就是修改了main中声明的行数组.

您在问题的代码中也有一个小错误。我认为前向声明int getLine(char, int);应该是int getline(char[], int);(注意[]和小写l);

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2014-02-09
    • 2021-04-25
    • 2013-12-15
    相关资源
    最近更新 更多