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
指的是相应函数调用中实际参数firstname
和lastname
执行的相同内存块。
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.
同样, a
和b
是内存中与x
和y
分开的对象,但是它们不是接收x
和y
的值 ,而是接收它们的地址 。 IOW
a == &x; b == &y; *a == x; *b == y;
数组的情况有点奇怪 – 除非它是sizeof
或一元&
运算符(或用于在声明中初始化字符数组的字符串文字)的操作数,否则类型为“N元素数组T
”的表达式将是转换(“衰减”)到“指向T
指针”类型的表达式,表达式的值将是数组中第一个元素的地址。
因此,如果将数组表达式传递给函数,函数实际接收的是指向数组第一个元素的指针,因此您不需要在函数调用中使用&
运算符。 这就是readln
发生的事情; 参数s
指向函数调用中数组的第一个元素。