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*
.
相同
您将 line
和 longest
的内存地址传递给了这些函数。
变量在超出范围时并非完全不可访问,
您只是不能直接使用名称来引用它们。
通常函数参数是传递给函数的原始值的副本,
所以改变它们不会影响原来的变量。
但在这种情况下,您传递的是变量的内存地址,并且这些函数能够通过指针更改数组元素的值。
#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*
.
相同
您将 line
和 longest
的内存地址传递给了这些函数。
变量在超出范围时并非完全不可访问,
您只是不能直接使用名称来引用它们。
通常函数参数是传递给函数的原始值的副本,
所以改变它们不会影响原来的变量。
但在这种情况下,您传递的是变量的内存地址,并且这些函数能够通过指针更改数组元素的值。