【问题标题】:Confusion between Passing by Value or Reference按值传递或引用传递之间的混淆
【发布时间】:2014-12-06 20:58:04
【问题描述】:

我在准备考试时尝试完成的问题如下:

:考虑一个具有此原型的函数: 无效转换(字符列表 [],字符 ch 1,字符 ch2); "convert" 函数将它在 "list" 中找到的每个字符 chi 更改为 字符 ch2。例如,函数调用“convert (name,'a','z')”将转换每个 'a' 到 'z' 在名为“name”的数组中。写出函数“convert”的定义。

我的程序运行到 main 中的两个 scanf 函数结束,我正在研究如何在不使用指针的情况下传递参数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char list[];
char ch1;
char ch2;

void convert(char list[], char ch1, char ch2);

int main()
{
    char list[15];
    char ch1, ch2;
    printf("Enter a string of characters:");
    scanf("%s", list);
    printf("Enter the first letter:");
    scanf("%c\n", &ch1);
    printf("Enter the second letter:");
    scanf("%c\n", &ch2);
}
void convert(char list[], char ch1, char ch2)
{
    int wordcount;
    int i = 0;
    int x = 0;
    int y = 0;
    if (list[i] == ch1)
    {
        x++;
        list[i] = ch2;

    }
    else if (list[i] != ch1)
    {
        y++;


    }
    else if (list[i] == NULL)
    {
        wordcount = (y + x + 1);

    } 

    printf("In the string there are %d letters and in %s the letter %c was changed to %c, %d          times.", wordcount , list, ch1, ch2, x);

}

【问题讨论】:

  • 在 main 处致电 convert(list, ch1, ch2);。但是 convert (char list[]) 的第一个参数是指针,而不是数组。
  • 当数组传递给函数时,按值传递(指针的)。如果您可以更改原型,则通过结构传递值(包括数组)包装数组。
  • 谢谢,我认为声明全局变量背后的想法是使各种函数能够使用该变量。另外我只是想澄清一下,指针位于写入字符串的 main 的开头?
  • 在这种情况下,传递给函数的指针指向 main 的字符串。
  • 好的,感谢您的澄清。

标签: c parameter-passing


【解决方案1】:

严格来说,C 中没有像 Fortran 中那样的“通过引用传递”或 Pascal 中的 var。所有参数都只是“按值”传递(有时也称为“按副本”)。

第一个参数声明在:

void convert(char list[], char ch1, char ch2) { .. }

表示有效:

void convert(char *list, char ch1, char ch2) { .. }

其中listchar * 类型的函数的局部指针变量。它与main() 中声明的list 数组没有任何共同之处。换句话说,两者都位于不同的范围内。我们说的是数组list(来自main())“衰减”为指针,该指针保存了其第一个元素的地址,然后将该指针的值分配给list参数。

【讨论】:

    【解决方案2】:

    ch1 和 ch2 已经是全局的,所以你不需要传递任何东西来转换。像这样:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 char list[15];
      5 char ch1;
      6 char ch2;
      7 
      8 void convert();
      9 
     10 int main()
     11 {
     12     scanf("%c\n",&ch1);
     13     scanf("%c",&ch2);
     14     printf("char 1: %c, char2: %c\n",ch1,ch2);
     15     convert();
     16     printf("char 1: %c, char2: %c\n",ch1,ch2);
     17     return 0;
     18 }
     19 
     20 void convert()
     21 {
     22     char temp;
     23     temp=ch1;
     24     ch1=ch2;
     25     ch2=temp;
     26 }
    

    【讨论】:

    • 没问题,如果这个答案适合你,你应该把它标记为接受的答案(复选标记,点击变成绿色)
    猜你喜欢
    • 2012-01-16
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2012-07-06
    • 2019-05-10
    • 2019-05-07
    • 2012-03-12
    相关资源
    最近更新 更多