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

时间:2012-07-05 07:42:51

标签: c++ pointers function-pointers

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

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。这是初学者的疑问。

6 个答案:

答案 0 :(得分:1)

您没有告诉我们st是什么,所以我们无法判断代码是否正确 完全不正确,或只是糟糕的设计。如果ststr的拼写错误 (只是猜测,因为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

从代码的外观来看,ststd::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)。