这是Kernighan C书中的一个练习的变体。基本上打印标准输入的最长行。
我的问题是,如果查看'复制方法',如果复制方法返回void,复制方法是如何实际工作的。我来自Java并且是第一次学习C语言。 在copy方法中,to和from char数组是本地的。如果它们不会返回main,它们如何实际存储在main方法中的最长和行变量中?
我很困惑......
非常感谢您的时间!
编辑:感谢您的回复。
再说一遍......
喔。所以你作者用指针传递值。这是非常令人困惑的,因为它之前的页面读取 - “...在C中,被调用的函数不能直接改变调用函数中的变量;它只能改变其私有的临时副本。”这是对的吗?
第二个问题是,如何使这些函数像Java,PHP等一样传递数据。或者这是C程序员看到的一个好处吗?
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
main () {
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0) {
if(len > max) {
max = len;
copy(longest, line);
}
}
if(max > 0) printf("%s", longest);
return 0;
}
int getline (char line[], int limit) {
int i, c;
for (i = 0; i < limit - 1 && (c = getchar()) != EOF && c != '\n'; i++) line[i] = c;
if (c == '\n') {
line[i] = c;
i++;
}
line[i] = '\0';
return i;
}
void copy(char to[], char from[]) {
int i;
i = 0;
while((to[i] = from[i]) != '\0')
i++;
}
答案 0 :(得分:3)
在C中,所有内容都按值传递。但是,您必须注意通过值传递的。
像char from[]
这样的C风格数组不是容器对象,就像您可能期望的其他语言一样。对于大多数实际目的,C数组相当于指向第一个元素的指针,即char * from
。
因此,参数to
和from
确实通过值传递,但它们是指针到数据,因此您可以修改指向的数据它们。
答案 1 :(得分:1)
尽管Java字符串是不可变的,但在C中,“字符串”只是字符数组。通过更改数组中的字符,更改在copy()外部是“可见的”。
答案 2 :(得分:0)
首先,这是你正在学习的可怕代码。它难以阅读,难以理解,并且不能处理超过给定限制的行。 ICK。
但是为了回答你的问题,当调用copy()时,这两个参数是指向存储字符数组的内存区域的指针。因此,当调用copy时,变量“to”等于调用帧中的“最长”,而“from”等于调用帧中的“line”。
答案 3 :(得分:0)
在问题的更新中,您会问:
“...在C语言中,被调用的函数不能直接改变调用函数中的变量;它只能改变其私有的临时副本。”这是对的吗?
是的,这是正确的,即使对于数组也是如此。然而,推理是微妙的。
对于整数参数:
int somefunc(int i) { return ++i; }
函数中对i
的更改只会影响i
的副本,而不会影响调用函数中与i
对应的值:
int i0 = 26;
int i1 = somefunc(i0);
同样,对于'array'参数:
int anotherfunc(int a[]) { return *++a; }
并致电:
int array[3] = { 13, 23, 37 };
int n = anotherfunc(array);
函数接收指针array
(又名&array[0]
)的副本,函数对函数a
所做的更改对array
没有任何影响在调用代码中。但是,如果函数是:
int modifyfunc(int a[]) { return *(++a) = 37; }
使用呼叫序列:
int array[3] = { 13, 23, 37 };
int n = modifyfunc(array);
int *ip = &array[1];
int m = modifyfunc(ip);
然后该函数不会修改调用函数中array
- 指针 - 的值,但它会修改数组指向的数据(确切地说,它将array[1]
设置为第一次调用时为37,第二次调用时为array[2]
到37),以及修改array
的副本(在函数内部称为a
)。
因此,如上所述,C只有值传递,但是当传递的值是一个指针时,被调用的代码可能会修改指针指向的内容 - 但不能修改调用代码中的实际指针。 / p>
是的,所示功能中的副作用总是不必要的。他们说明了这一点,而不是现实的代码。