C++ 常量字符和;作为函数的参数

C++ 常量字符和;作为函数的参数,c++,linux,multithreading,pointers,boost,C++,Linux,Multithreading,Pointers,Boost,我需要一些关于以下代码块的说明。我正在研究类似的编码,我想了解它是如何工作的。谷歌上没有太多的提及,我发现的唯一一个是技术性太强,我无法理解 在下面的代码中,线程和非线程函数具有不同的输出。为什么呢 #include <boost/thread.hpp> #include <iostream> #include <stdio.h> using namespace std; void fTry1(const char&); void fTry2(co

我需要一些关于以下代码块的说明。我正在研究类似的编码,我想了解它是如何工作的。谷歌上没有太多的提及,我发现的唯一一个是技术性太强,我无法理解

  • 在下面的代码中,线程和非线程函数具有不同的输出。为什么呢

    #include <boost/thread.hpp>
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    void fTry1(const char&);
    void fTry2(const char&);
    
    int main()
    {
      boost::thread tTry1, tTry2;
      const char *a = "efgh";
    
      tTry1 = boost::thread(fTry1, *a);
      fTry2(*a);
      tTry1.join();
    
      return 0;
    }
    
    void fTry1(const char& a)
    {
      cout << "Thread" << endl;
      cout << &a << endl;
    }
    
    void fTry2(const char& a)
    {
      cout << "Non-thread" << endl;
      cout << &a << endl;
    }
    
    再说一遍,为什么

    --


    我正在处理的代码使用数字2,但传递的字符串是文件夹的路径,因此我需要整个字符串,而不仅仅是第一个字符。但是,由于我不了解它是如何工作的,所以我无法很容易地对它进行更改。

    const char*a=“efgh”中的字符串文字使用隐藏的终止符
    '\0'
    编译

    当您像
    *a
    那样传递它时,您正在取消对它的引用。你基本上只传递了一个角色。这对于非线程函数来说是可以的,因为如果使用
    &a
    获取字符
    a
    的地址,使其成为c字符串,它仍然会指向包含终止符的字符串文本
    “efgh”
    cout
    将一直打印,直到它碰到终止符

    但是,我怀疑,当您将
    *a
    传递给
    boost::thread
    时,它实际上复制了字符,但只复制了字符,而不是整个字符串。当您稍后使用
    &a
    将其转换回c样式字符串时,不再有终止符字符,因此
    cout
    将继续不断地打印,您会看到垃圾


    当您更改
    coutconst char*a=“efgh”中的字符串文字时使用隐藏的终止符
    '\0'
    编译

    当您像
    *a
    那样传递它时,您正在取消对它的引用。你基本上只传递了一个角色。这对于非线程函数来说是可以的,因为如果使用
    &a
    获取字符
    a
    的地址,使其成为c字符串,它仍然会指向包含终止符的字符串文本
    “efgh”
    cout
    将一直打印,直到它碰到终止符

    但是,我怀疑,当您将
    *a
    传递给
    boost::thread
    时,它实际上复制了字符,但只复制了字符,而不是整个字符串。当您稍后使用
    &a
    将其转换回c样式字符串时,不再有终止符字符,因此
    cout
    将继续不断地打印,您会看到垃圾


    默认情况下更改
    cout时,传递给
    boost::thread
    的参数将被
    value
    捕获。要通过
    reference
    捕获它们,必须使用
    boost::ref

    tTry1 = boost::thread(fTry1, boost::ref(*a));
    
    这与lambda函数非常相似,例如:

    const char *a = "efgh";
    const char &c = *a;
    
    auto garbage = [c]() { // c captured by value
       cout << &c << endl;
    };
    
    auto works = [&c]() { // c captured by ref
        cout << &c;
    };
    
    garbage();
    works();
    
    const char*a=“efgh”;
    常量char&c=*a;
    自动垃圾=[c](){//c被值捕获
    
    cout默认情况下,传递给
    boost::thread
    的参数将被
    value
    捕获。要通过
    reference
    捕获它们,必须使用
    boost::ref

    tTry1 = boost::thread(fTry1, boost::ref(*a));
    
    这与lambda函数非常相似,例如:

    const char *a = "efgh";
    const char &c = *a;
    
    auto garbage = [c]() { // c captured by value
       cout << &c << endl;
    };
    
    auto works = [&c]() { // c captured by ref
        cout << &c;
    };
    
    garbage();
    works();
    
    const char*a=“efgh”;
    常量char&c=*a;
    自动垃圾=[c](){//c被值捕获
    
    谢谢你的解释。关于你的问题,我真的很想让我和未来的程序员在这个应用程序上工作时更容易一些,但是最初做这个的人在几个函数中使用了它。我不想弄乱其他的工作函数,但有一个函数在调用时会导致分段错误,所以我nstead,我只是想了解它是如何工作的,这样我也可以使用它。谢谢你的解释。关于你的问题,我真的很想让我和未来的程序员更容易地使用这个应用程序,但是最初制作这个应用程序的人在几个函数中使用了它。我不想干扰其他的工作函数,但是有一个在调用时会导致分段错误,所以我只是想了解它是如何工作的,这样我也可以使用它。谢谢!我同意你不在线程中使用指针的观点。如果我是最初开发我正在开发的应用程序的人,我会编写得更好。遗憾的是,我是一个“专家”编码。谢谢!我同意你不在线程中使用指针的观点。如果我是最初开发我正在开发的应用程序的人,我会编写得更好。遗憾的是,一位“专家”编写了它。
    tTry1 = boost::thread(fTry1, boost::ref(*a));
    
    const char *a = "efgh";
    const char &c = *a;
    
    auto garbage = [c]() { // c captured by value
       cout << &c << endl;
    };
    
    auto works = [&c]() { // c captured by ref
        cout << &c;
    };
    
    garbage();
    works();