【问题标题】:C++ Question about Char Strings and Pointers关于字符字符串和指针的 C++ 问题
【发布时间】:2020-03-15 14:32:32
【问题描述】:

我对 C++ 还很陌生,但仍在尝试理解指针以及何时需要它们。但是对于这个问题,我正在四处寻找创建头文件和类。 我的第一个“测试”是创建一个可以处理“日志”的类,所以我这样做了。

记录器.h

#pragma once
#include <iostream>
using namespace std;

class Logger
{
    public:
        Logger();
        void logC(const char* message);
        void logCA(const char message[]);
        void logS(string message);
};

记录器.cpp

#include "Logger.h"

Logger::Logger() {

}

void Logger::logC(const char* message)
{
    cout << message << endl;
}

void Logger::logCA(const char message[])
{
    cout << message << endl;
}

void Logger::logS(string message)
{
    cout << message << endl;
}

然后在我的主要功能上,我只是这样使用它们。

#include "Logger.h"

int main(){

    Logger myLogger;

    myLogger.logC("Hello");
    myLogger.logCA("Alo");
    myLogger.logS("Hola");

    cout << endl;
    system("pause");
    return 0;
}

这里有几个问题。为什么我会使用一种方法而不是其他方法。而且,在 const char* 方法上,为什么这是一个指向 char 的指针,它需要一个 char 数组作为有效,而且,如果它接收到一个 char 位置的地址,为什么输出是整个数组而不是它所在的内存地址。 (而且它还“知道”在哪里停止,它不会从那个地址永远打印出来)

【问题讨论】:

  • 当声明为参数时,数组声明被翻译为指针。这意味着const char message[] 确实等于const char* message
  • 请在每个帖子中保留一个问题。 为什么我会使用一种方法而不是其他方法如果您没有特定的用例,这不是一个好问题。
  • 如果你真的是c++新手,我建议干脆不要使用指针,你可以在了解一些c++概念后回到它。
  • 好吧,在这种情况下,有一个特定的用例。将字符串记录到控制台是用例。
  • 这是首要目标。 apple 苹果在一个较低的层次上讨论:实现该目标的特定方法的用例。 “将字符串记录到控制台”可以通过多种不同的方式完成

标签: c++ pointers


【解决方案1】:
void logC(const char* message);

接受指向char 缓冲区的指针。这也称为 C 字符串(只要它是空终止的,你的就是这样,因为它是一个字符串文字)。

void logCA(const char message[]);

一模一样。不要让[] 欺骗你:这实际上与const char* message 相同。那不是因为数组是指针:它们不是。这是 C 历史上的一个奇怪的奇怪现象。 看起来 像没有维度的“数组类型”的函数参数被视为指针参数。呸!

void logS(string message);

接受std::string。这些可以从 C 字符串构造,当您传入字符串文字时,这会在幕后发生。

哪个最好?这是非常主观的。可以说你想要一个const std::string_view,它可以免费接受任何这些。但是对差异的深入讨论超出了这里的范围;但是,它可以在您的书中找到。

它接收到一个字符位置的地址,为什么输出是整个数组而不是它所在的内存地址

因为coutchar* 有一个特殊规则,知道您通常希望这些被视为字符串,因为您确实这样做了。它不是打印指针的值(内存地址),而是取消引用并打印它指向的缓冲区中的所有字符,以空终止符结束。这是一个功能。

如果您使用转换为另一种指针类型,您可以“关闭它”,例如cout &lt;&lt; (void*)message 现在你会看到一个地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多