C函数参数可以设置变量吗?

我无法弄清楚如何在下面的C代码中设置firstname和lastname变量。

printf("Hello, %s, %s\n", firstname, lastname); 

它看起来readln函数的char [s]参数是设置firstname和lastname。

这是可能的,如果是这样的话,我可以做一些研究。

谢谢

编辑:下面是一个更简单的版本。 看起来参数是设置变量。

 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  #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); } 

将数组作为参数传递给函数时,它就像传递数组地址一样。 然后,该函数可以修改此地址的上下文,表示数组本身。

例如,函数可以定义为int readln(char *s, int maxlen) ,function将保持不变。

调用函数时,您可以使用readln(firstname, STRLEN)readln(&firstname[0], STRLEN) 。 两者都可以使用任何一个函数定义(它们是正交的)。

关于这个主题的一个很好的教程

通用术语是“通过引用传递” – readln的forms参数s 指的是相应函数调用中实际参数firstnamelastname执行的相同内存块。

C实际上通过传递所有函数参数 – 函数定义中的forms参数是函数调用中实际参数的内存中的单独对象,并且实际参数的值被复制到forms参数:

 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. 

同样, ab是内存中与xy分开的对象,但是它们不是接收xy ,而是接收它们的地址 。 IOW

  a == &x; b == &y; *a == x; *b == y; 

数组的情况有点奇怪 – 除非它是sizeof或一元&运算符(或用于在声明中初始化字符数组的字符串文字)的操作数,否则类型为“N元素数组T ”的表达式将是转换(“衰减”)到“指向T指针”类型的表达式,表达式的值将是数组中第一个元素的地址。

因此,如果将数组表达式传递给函数,函数实际接收的是指向数组第一个元素的指针,因此您不需要在函数调用中使用&运算符。 这就是readln发生的事情; 参数s指向函数调用中数组的第一个元素。