指针总是让我对我打算在代码中使用的逻辑感到茫然,如果有人可以帮助我理解一些真正有用的概念。这是我程序中的代码段,
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[0]
的地址,我必须编写char *
类型的函数。我需要知道这样做的原因,如果address是整数值,为什么我不能将函数定义为int
类型?
P.S。这是初学者的疑问。
答案 0 :(得分:1)
您没有告诉我们st
是什么,所以我们无法判断代码是否正确
完全不正确,或只是糟糕的设计。如果st
是str
的拼写错误
(只是猜测,因为str
没有在任何地方使用),那么你就有了
未定义的行为,并且程序不正确,因为您正在返回
指向已被破坏的对象的指针。无论如何,一个
像formatForHtml
这样的函数应返回std::string
,作为a
值,而不是指针(当然也不是指向非const的指针)。
我可能会补充一点,你不使用循环来复制字符串值
字符。 std::string
充当普通值类型,因此您可以
分配:st = strBegin;
。
编辑:
为了记录,我已经重新检查了你的代码。自然的方式 写它将是:
std::string
formatForHtml( std::string const& cdata, std::string const& tag )
{
return '<' + tag + '>' + cdata + "</" + tag + '>';
}
没有指针(至少不可见 - 事实上,“+运算符”),并且充分利用
std::string
设施。
答案 1 :(得分:0)
我必须编写'char *'类型的函数我需要知道这样做的原因
没有理由这样做。只需返回std::string
。
从代码的外观来看,st
是std::vector<char>
。由于std::vector
具有连续内存,&st[0]
是向量中第一个char
的地址,因此指向向量的不以null结尾的字符串表示,在函数外部不是很有用,因为找不到长度。
答案 2 :(得分:0)
这是尴尬的代码,你期待'str'作为一个参数,但是你返回它的内存位置?为什么不返回字符串呢?
你的代码有一些拼写错误。 (当你输入'st'时,你的意思是'str'吗?如果没有,那么'st'定义在哪里?)
至于为什么你不能将函数定义为“int”类型,这是因为“int”是与“指向char”的指针不同的类型。
就个人而言,我会返回'string',并且在那里只有一个'return str'。
答案 3 :(得分:0)
指针是指针,而不是整数值。当且仅当st是全局变量或在此函数中声明为静态时,代码才是正确的。但返回字符串最好是返回指针。
答案 4 :(得分:0)
简单。
string str
包含一堆字符。
str[0]
返回第一个字符。
因此,
&str[0]
给出第一个字符的地址,因此它是一个“char *”---“char”,无论指针指向什么,“*”是指针的“地址”部分。指针的类型与被指向的对象有关。
此外,地址可能只是硬件级别的“整数”(一切都是整数......除了整数本身,它们是一堆bool),但这对于更高级别的语言并不意味着什么。对于更高级别的语言,指针是指针,而不是整数。
将一个视为另一个几乎总是一个错误,C ++ 11甚至添加了nullptr关键字,因此我们不必依赖一个有效的“指针是一个整数”的情况。
顺便说一下,你的代码不起作用。 “str”仅在函数的持续时间内存在,因此当函数返回“str”时不再存在,这意味着您返回的指针指向一个大的黑色无处。
答案 5 :(得分:0)
为什么不使用字符串作为函数的返回类型?
首先:指针是内存中某个东西的地址,所以你不能用整数替换它(只有一些肮脏的技巧)。
第二:&amp; st [0]是字符串用于存储其内容的内部缓冲区的地址。当st超出范围(或被重用于下一次调用)时,它将被覆盖或返回给堆管理器,因此调用此函数的那个将以一些垃圾结束。
顺便说一句,你的大多数函数都是字符串类可以自己完成的无效工作(例如将strBegin复制到st)。