-1

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

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 *。我需要知道这样做的原因,如果地址是整数值,为什么我不能将函数定义为int类型?

PS这是一个初学者级别的疑问。

4

6 回答 6

1

你不告诉我们是什么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::strings 设施。

于 2012-07-05T07:51:40.970 回答
0

我必须编写'char *'类型的函数我需要知道这样做的原因

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

从您的代码的外观来看,st是一个std::vector<char>. 由于std::vector具有连续内存,&st[0]是向量中第一个的地址char,因此指向向量表示的空终止字符串,这在函数之外不是很有帮助,因为您找不到长度。

于 2012-07-05T07:46:41.233 回答
0

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

你的代码有一些错别字。(当您输入“st”时,您的意思是“str”吗?如果不是,那么“st”在哪里定义?)

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

就个人而言,我会返回“字符串”,并在最后有一个“返回 str”。

于 2012-07-05T07:47:21.587 回答
0

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

于 2012-07-05T07:48:57.940 回答
0

简单的。

string str

是包含一堆字符的东西。

str[0]

返回第一个字符。

所以,

&str[0]

给你第一个字符的地址,因此它是一个“char *”---“char”是指针指向的任何内容,“*”是指针的“地址”部分。指针的类型与所指向的对象有关。

此外,地址可能只是硬件级别的“整数”(一切都是整数......除了整数本身,它们是一堆布尔值),但这对于更高级别的语言没有任何意义。对于高级语言,指针是指针,而不是整数。

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

顺便说一句,您的代码将无法正常工作。“str”仅在函数执行期间存在,因此当函数返回时,“str”不再存在,这意味着您返回的指针指向一个大黑无处。

于 2012-07-05T07:49:34.493 回答
0

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

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

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

顺便说一句,你的大部分函数都做了字符串类可以自己做的不必要的工作(例如将 strBegin 复制到 st)。

于 2012-07-05T07:50:58.620 回答