我无法弄清楚如何在下面的C代码中设置firstname和lastname变量。
printf("Hello, %s, %s\n", firstname, lastname);
看起来readln函数的char [s]参数是设置firstname&姓。
这是否可能,如果是这样的话,我可以做一些研究。
由于
编辑:下面是一个更简单的版本。看起来参数是设置变量。
int foo(char s[]){
s[0]='w';
s[1]='\0';
return 5;
}
int main() {
char name[2];
int wtf;
wtf = foo(name);
printf("%s\n", name);
}
参数char s []是设置名称
#include <stdio.h>
#define STRLEN 5
int readln(char s[], int maxlen) {
char ch;
int i;
int chars_remain;
i = 0;
chars_remain = 1;
while (chars_remain) {
ch = getchar();
if ((ch == '\n') || (ch == EOF) ) {
chars_remain = 0;
} else if (i < maxlen - 1) {
s[i] = ch;
i++;
}
}
s[i] = '\0';
return i;
}
int main(int argc, char **argv) {
char firstname[STRLEN];
char lastname[STRLEN];
int len_firstname;
int len_lastname;
printf("Enter your first name:");
len_firstname = readln(firstname, STRLEN);
printf("Enter your last name:");
len_lastname = readln(lastname, STRLEN);
printf("Hello, %s, %s\n", firstname, lastname);
printf("Length of firstname = %d, lastname = %d", len_firstname, len_lastname);
}
答案 0 :(得分:4)
当您将数组作为参数传递给函数时,它就像传递数组地址一样。然后,该函数可以修改此地址的上下文,表示数组本身。
例如,该功能可以定义为readln(firstname, STRLEN)
,功能将保持不变。
调用此功能时,您可以使用readln(&firstname[0], STRLEN)
或{{1}}。两者都可以使用任何一个函数定义(它们是正交的)。
关于这个主题的好tutorial。
答案 1 :(得分:2)
一般术语是“通过引用传递” - s
中的形式参数readln
将引用到实际参数firstname
的同一块内存中和lastname
在相应的函数调用中执行。
C实际上通过值传递所有函数参数 - 函数定义中的形式参数是函数调用中实际参数的内存中的单独对象,并且复制了实际参数的值到形式参数:
void swap( int a, int b ) // a receives a *copy* of x's value, b receives
{ // a *copy* of y's value
int t = a; // updates to a and b have no effect on x and y
a = b;
b = t;
}
void bar( void )
{
int x = 1, y = 2;
swap( x, y ); // x and y are not actually updated
}
我们伪通过将指针传递给我们想要修改的对象来传递引用语义:
void swap( int *a, int *b ) // a receives the *address* of x, b receives the
{ // address of y
int t = *a; // updates to *a and *b *do* have and effect on
*a = *b; // x and y
*b = t;
}
void bar( void )
{
int x = 1, y = 2;
swap( &x, &y ); // instead of passing the *values* of x and y,
} // we pass their addresses.
同样,a
和b
在内存中与x
和y
分开,但不是接收{{>>的值 1}}和x
,他们会收到地址。 IOW
y
对于数组,情况有点奇怪 - 除非它是 a == &x;
b == &y;
*a == x;
*b == y;
或一元sizeof
运算符的操作数(或用于在声明中初始化字符数组的字符串文字),“{元素数组&
”类型的>表达式将被转换(“衰减”)为“指向T
的指针”类型的表达式,表达式的值将是数组中第一个元素的地址。
因此,如果将数组表达式传递给函数,函数实际接收的是指向数组第一个元素的指针,因此您不需要在函数调用中使用T
运算符。这就是&
中发生的事情;参数readln
指向函数调用中数组的第一个元素。