C 中变量的作用域,为什么函数在 main 中修改值?

Scope of variables in C, why is function modyfing values in main?

#include <stdio.h>
#define MAXLINE 100

int get_line(char line[], int maxline);
void copy(char to[], char from[]); 


/*Prints longest input line*/

int main(){
    int len; /*Current line length*/
    int max; /*Maximum length so far*/
    char line[MAXLINE]; /*Current input line*/
    char longest[MAXLINE]; /*Longest line is saved here*/

    max = 0;
    while ((len = get_line(line, MAXLINE)) > 0){
        if (len > max){
            max = len;
            copy (longest, line);
        }
    }
    
    if (max > 0) 
        printf("%s", longest);

    return 0;
}

/*get_line: read a line into s, return length*/

int get_line(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] = '[=10=]';
    return i;
}

/*copy: Copy 'from' into 'to'*/

void copy (char to[], char from[]){
       int i;
       i = 0;

       while((to[i] = from[i]) != '[=10=]')
           ++i;
}

此代码来自 The C Programming Language 的第 1.9 节,我想了解它是如何工作的。我不明白变量的范围是如何工作的。在 while 循环中,函数 get_line 修改变量 line,函数 copy 修改变量 longest.

他们不应该只在功能范围内吗?我不明白为什么这些函数能够在 main

中修改它们

数组的名称实际上是指向第一个元素的指针。
[] 运算符的作用与 *(array + n)

相同

编辑: 正如评论中指出的那样,这可能会造成混淆和误导。
我建议你看看这个问题:Is an array name a pointer?

int a[10];
a[1] == *(a + 1) // true

get_line()copy()参数类型为char[],与char*.
相同 您将 linelongest 的内存地址传递给了这些函数。

变量在超出范围时并非完全不可访问,
您只是不能直接使用名称来引用它们。
通常函数参数是传递给函数的原始值的副本,
所以改变它们不会影响原来的变量。

但在这种情况下,您传递的是变量的内存地址,并且这些函数能够通过指针更改数组元素的值。