通过指针传递单个字符Vs通过指针传递字符串

时间:2014-09-22 11:56:45

标签: c string pointers character parameter-passing

传递字符串

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),那么它将期望字符串的地址而不是字符。

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

试试这个:

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

与您的问题类似的用法。如,

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

答案 2 :(得分:1)

void foo(char &ch)仅适用于C ++,而不适用于C至少C99,其中引用不是语言的一部分。

看看你的用法,我相信你想要

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

您可能会发现this教程有助于理解上述参数类型的原因以及它与字符串参数的不同之处。 (第一版)

答案 3 :(得分:0)

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

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