【问题标题】:Passing a single character by pointer Vs Passing a string by pointer通过指针传递单个字符 Vs 通过指针传递字符串
【发布时间】:2014-09-22 11:56:45
【问题描述】:

传递一个字符串

void foo(char *str)
{
  printf ("\nPassed argument is %s", str);
  strcpy(str,"XYZ");
  printf ("\nChanged argument is %s", str);
}

函数调用将是:

char abc[10];
strcpy (abc,"ABC");
foo(abc);
printf ("\nNew value of string is %s",abc);

上面的代码按预期工作。它有效,因为我通过指针传递了字符串。现在,如果我想要修改单个字符的函数,你会怎么做呢?

void foo(char &ch)
{
  printf ("\nPassed argument is %c", ch);
  ch = 'A';
  printf ("\nChanged argument is %c", ch);
}

函数调用将是:

char c;
c = 'x';
foo(&c);
printf ("\nNew value of character is %c",c);

此代码不起作用。我相信这是一个简单的问题,但我找不到答案。如果我将函数原型更改为void foo(char *ch),那么它会期望字符串的地址而不是字符的地址。

你可能会问,为什么我需要这样做,为什么我不能让函数返回字符!这是一种解决方案,但我也想知道扭曲的方式。

【问题讨论】:

  • 在声明函数参数无效时使用与符号&,它是C++,用于将参数标记为引用而不是指针。为了让它工作,你当然不能传递指针。
  • 另外,当你有一个指针时,它是内存中某个地方的地址。是指向字符串还是单个字符,取决于你如何对待和使用指针。

标签: c string pointers character parameter-passing


【解决方案1】:
  1. C 中没有“字符串”。
  2. char * 定义了一个指向 char 的类型。
  3. 具有char * p 作为参数的函数是否可以期望p + 1 指向有效内存取决于作为参数传递给函数的内容。函数本身对此一无所知。

【讨论】:

    【解决方案2】:

    你不应该忘记,在 C 中,字符串只是 以空终止符 (0) 结尾的字符数组。 所以,char * 是指向字符的指针。 但是由于字符串是用 C 语言制作的,它可以 以及指向一个字符串。

    试试这个:

    void foo(char *ch)
    {
    *ch='a';
    }
    

    在您的问题中使用类似的用法。例如,

    char c;
    c = 'x';
    foo(&c);
    printf ("\nNew value of character is %c",c);
    

    【讨论】:

      【解决方案3】:

      void foo(char &ch) 仅在 C++ 中有效,至少在 C99 之前在 C 中无效,其中引用不是语言的一部分。

      看你的使用情况,相信你想要

      void foo(char *ch)
      {
        *ch = 'A';
      }
      

      您可能会发现this 教程有助于理解为什么上述参数类型以及它与字符串参数有何不同。 (第一版)

      【讨论】:

        【解决方案4】:

        第二个 foo 函数不应该是 ..

            void foo(char *ch)
        {
          printf ("\nPassed argument is %c", ch);
          *ch = 'A';
          printf ("\nChanged argument is %c", ch);
        }
        

        【讨论】:

        • georgem 已经发布了我错过的代码,您可以尝试一下吗.. 我也编辑了它
        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2023-03-03
        • 2018-08-19
        • 1970-01-01
        相关资源
        最近更新 更多