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

时间:2017-05-10 19:21:24

标签: c function parameters

我无法弄清楚如何在下面的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);
}

2 个答案:

答案 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.

同样,ab在内存中与xy分开,但不是接收{{>>的 1}}和x,他们会收到地址。 IOW

y

对于数组,情况有点奇怪 - 除非它是 a == &x; b == &y; *a == x; *b == y; 或一元sizeof运算符的操作数(或用于在声明中初始化字符数组的字符串文字),“{元素数组&”类型的>表达式将被转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将是数组中第一个元素的地址。

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