C++ C+中的指针+;-初学者';s困境

C++ C+中的指针+;-初学者';s困境,c++,pointers,function-pointers,C++,Pointers,Function Pointers,如果有人能帮助我理解一些真正有用的概念,指针总是让我对我打算在代码中使用的逻辑一无所知。这是我程序中的一段代码片段 vector <char> st; char *formatForHtml(string str, string htmlTag) { string strBegin; strBegin = "<"; strBegin.append(htmlTag); strBegin.append(">"); strBegin.

如果有人能帮助我理解一些真正有用的概念,指针总是让我对我打算在代码中使用的逻辑一无所知。这是我程序中的一段代码片段

vector <char> st; 
char *formatForHtml(string str, string htmlTag)
{ 
    string strBegin;
    strBegin = "<";
    strBegin.append(htmlTag);
    strBegin.append(">");
    strBegin.append(str);
    string strEnd = "</";
    strEnd.append(htmlTag);
    strEnd.append(">");
    strBegin.append(strEnd);
    st.resize(strBegin.size());
    for (int i =0;i <strBegin.size();i++) {
        st[i] = strBegin.at(i);
    }
    return &st[0];
}
向量st;
char*formatForHtml(字符串str、字符串htmlTag)
{ 
字符串strBegin;
strBegin=“”);
strBegin.append(str);
字符串强度=”);
strBegin.append(加强);
st.resize(strBegin.size());
对于(int i=0;i
我必须编写'char*'类型的函数,我需要知道这样做的原因

没有理由这样做。只需返回一个
std::string


从代码的外观来看,
st
是一个
std::vector
。由于
std::vector
具有连续内存,
&st[0]
是向量中第一个
char
的地址,因此指向向量所表示的not以null结尾的字符串,这在函数之外没有太大帮助,因为您找不到长度。

这是一个笨拙的代码,您希望将'str'作为参数,但随后返回它的内存位置n?为什么不返回字符串本身

您在那里的代码有一些拼写错误。(您键入“st”时是指“str”吗?如果不是,那么“st”是在哪里定义的?)

至于为什么不能将函数定义为“int”类型,那是因为“int”与“指向char的指针”是不同的类型


就我个人而言,我会返回'string',并在末尾有一个'return str'。

指针是指针,而不是整数值。当且仅当st是全局变量或在该函数中声明为静态时,代码才是正确的。但返回字符串比返回指针更好。

简单

string str
是包含一堆字符的东西

str[0]
返回第一个字符

所以,

&str[0]
为您提供第一个字符的地址,因此它是“char*”--“char”表示指针指向的任何对象,“*”表示指针部分的“地址”。指针的类型与指向的对象有关

此外,地址在硬件级别上可能只是“整数”(所有东西都是整数…除了整数本身,它们是一堆布尔),但这对高级语言来说并不意味着什么。对于高级语言,指针是指针,而不是整数

将一个指针视为另一个指针几乎总是一个错误,C++11甚至添加了nullptr关键字,因此我们不必依赖一个有效的“指针是整数”案例


顺便说一句,你的代码不会工作。“str”只在函数的持续时间内存在,所以当函数返回“str”时,它就不存在了,这意味着你返回的指针指向了一个黑色的地方。

为什么不使用字符串作为函数的返回类型呢

第一:指针是内存中某物的地址,所以不能用整数替换它(只能用一些肮脏的技巧)

第二:&st[0]是字符串用于存储其内容的内部缓冲区的地址。当st超出范围(或在下次调用中重新使用)时,它将被覆盖或返回给堆管理器,因此调用此函数的人将以一些垃圾结束


顺便说一句,您的大多数函数都做了字符串类本身可以做的不必要的工作(例如将strBegin复制到st)。

您没有告诉我们st
是什么,因此我们无法判断代码是否正确 完全不正确,或者只是糟糕的设计。如果
st
str
(只是猜测一下,因为
str
没有在任何地方使用),那么您就有了 未定义的行为,并且程序不正确,因为您正在返回 指向已被破坏的对象的指针。无论如何 类似于
formatForHtml
的函数应该返回一个
std::string
,作为 值,而不是指针(当然也不是指向非常量的指针)

我可以补充一点,您不需要使用循环来按字符复制字符串值 字符。
std::string
充当普通值类型,因此您可以 分配:
st=strBegin;

编辑:

为了记录在案,我重新检查了你的代码 写作的目的是:

std::string
formatForHtml( std::string const& cdata, std::string const& tag )
{
    return '<' + tag + '>' + cdata + "</" + tag + '>';
}
std::string
formatForHtml(标准::字符串常量和cdata,标准::字符串常量和标记)
{

return“+cdata+”他返回的是
st
,而不是
str
@Luchian:你的评论太快了!:)*…*是一个降价格式命令。你可以用\*来代替。我喜欢你的第一句话。它说得非常简洁---就我所知,没有理由返回
char*
。(在某些情况下,
char const*
可能是合理的。但即使是这样的情况也很少见,除了专家之外,可能不会引起兴趣。)@Luchian这里的长度不是一个重要因素,我需要知道的是,是否可以返回
st[0]的地址
如果不将函数定义为
char*
@vin而不将其定义为
char*
,您可以返回一个字符串并按建议执行。否则我看不到任何好处(您可以返回一个
void*
,但不要这样做).另请参见这个问题@LuchianGrigore请参见edit@vin那么好吧,我的答案适用。@LuchianGrigore:是的!:)@vin
std::string tmp=''+cdata+“