【问题标题】:Passing single char pointer to function in C将单个字符指针传递给C中的函数
【发布时间】:2020-07-02 14:48:02
【问题描述】:

这可能是基本问题,但我似乎找不到解决方案。

我有这样的代码:

int main(){
   char val = 'I';
   function(&val);
   return 0;
}

和功能:

void function(char* val){
    if (*val == 'I') {
         *val = 'S';
    }
}

但是函数似乎将 char* 解释为字符数组,而我只需要访问单个字符,但我还需要在该函数中更改它的值。我可以为此使用的最简单的解决方案是什么?

谢谢。

【问题讨论】:

  • 这段代码看起来不错。您是否验证了输出?调用函数后val应该是S
  • However function seems to interpret char* as array函数是怎么表达的?
  • 问题出在其他地方。您没有向我们展示实际代码。因此,我是 DV-ting 并投票接近 godbolt.org/z/jzVVxX
  • 根据 OP 的回答,他们有一些涉及问题中未显示的各种参数声明的错误,因此问题应该关闭,因为它没有充分呈现。

标签: c function pointers char edit


【解决方案1】:

感谢任何花时间回复的人。显然我有错误的定位参数 char* 和 int,所以编译器没有把它当作错误,因为它们可以相互解释。我觉得今天的代码对我来说已经足够了^^。

【讨论】:

    【解决方案2】:

    C 中的所有数组都被解释为指向第一个元素的指针,并且任何指针都可以用作数组基以使用 [n] 语法访问第 n 个元素。如果你想在函数中改变那个字符的值,那么你必须传递一个指向它的指针,但是像你这样访问它没有问题:

        if (*val == 'I') {
             *val = 'S';
        }
    

    更多的是关于你的函数期望输入是什么,如果它期望输入是一个指向单个字符的指针,那么它完全可以接收 char* 并且只访问这个指针指向的数据。在 C 中,当您有一个指针 p 时,您不能限制自己将其视为数组基并编写 p[5],即使它指向单个字符 p[5]只会将 char 的大小提前 5 倍,并将在那里找到的任何数据视为 char 并返回它。

    通常当函数接收一个缓冲区作为指针时,它也会接收该缓冲区的大小作为参数,例如: 空函数(char* buf, int buf_length)

    您可能正在寻找的内容在 C++ 中可用,称为通过引用传递,您可以阅读它here

    在 C++ 中,这可以工作:

    // The & here indicates that val is received by reference, meaning that
    // if we change val here, it will be also changed where we passed it from.
    // Behind the scene it is done by passing a pointer(char*) and replacing
    // every access to the variable with dereferencing and then accessing:
    // val == 'I' -> *val == I     or val = 'S' with *val = 'S'
    void function(char &val){ 
        if (val == 'I') {
            val = 'S';
        } 
    }
    
    int main(){
       char val = 'I';
       function(val); // passing as normal char, but will be passed by reference
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您可以将指针解释为索引 0 处的数组。

      void function(char* val) {
          if (val[0] == 'I') {
               val[0] = 'S';
          }
      }
      

      【讨论】:

      • 仍然抛出异常。在调试中看到它时,输入函数后显示“val 0x00000000000000bc char*”
      • 这个答案不是答案,因为 OP 没有显示实际代码, *valval[0] 之间没有区别。 DV 亭
      猜你喜欢
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2014-06-20
      • 2012-02-22
      • 2010-10-02
      • 2012-04-12
      相关资源
      最近更新 更多