通过价值或参考传递之间的混淆

时间:2014-12-06 20:58:05

标签: c parameter-passing

我试图在考试准备中完成的问题如下:

:考虑使用此原型的函数: void convert(char list [],char ch 1,char ch2); “转换”功能将它在“列表”中找到的每个字符chi更改为 人物ch2。例如,函数调用“convert(name,'a','z')”将转换每个 名为“name”的数组中的'a'到'z'。写下函数“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);

}

2 个答案:

答案 0 :(得分:3)

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

第一个参数声明:

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

有效地表示:

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

其中list是函数的char *类型的本地指针变量。它与list中声明的main()数组没有任何共同之处。换句话说,两者都位于不同的范围内。我们所说的是数组list(从main())“衰减”到指针,它保存第一个元素的地址,然后将这个指针的值赋值给list参数。

答案 1 :(得分:0)

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 }