基本上我有两个函数,main有一个指针指向c
(可变内存地址)。我的问题是为什么我不能从print
函数调用指针并打印出字符串。另外,如果我有一个类文件并想从那里调用指针(不向print函数添加参数),该怎么办?
#include <iostream>
#include <string>
using namespace std;
static int print(){
cout << *pointer;
}
int main() {
string c = "Hello World!";
string *pointer = new string;
pointer = &c;
print();
return 0;
}
答案 0 :(得分:5)
您需要将指针传递给print函数,因为它不是全局的。
static int print(string* pointer)
这应该可以正常工作。
此外,您的行有内存泄漏
string *pointer = new string;
并使用
调用它print(pointer);
分配并永不删除新的字符串对象。您可能想要使用
string *pointer = NULL
相反。此外,using namespace <whatever>
可能会导致问题。请确保您有充分的理由这样做,而不是避免输入一些额外的字符。
编辑:
正如这里建议的那样,快速缩小范围。
查看范围的方式有点像对象的生命以及谁可以看到它。您创建的对象(不使用new)具有一个范围,直到它超出代码块。是阻止函数,条件语句或循环。此外,只能通过代码BELOW来查看对象。
void foo()
{
Bar b;
/** really cool code **/
}
这里,整个函数可以看到Bar类型的对象b。一旦功能结束,b&#34;超出范围&#34;并自动调用析构函数。注意:使用NEW创建的指针不会发生这种情况。
void foo()
{
Bar b1;
for(size_t index = 0; index < 10; ++index)
{
/** some cool code **/
Bar b2;
/** some equally cool code **/
}
if(false)
{
Bar b3;
/** some useless code **/
}
/** really cool code **/
}
这里,整个功能可以看到b1。 b2只能被同样酷的代码看到&#34;在for循环中。 &#34;酷代码&#34;无法看到它,因为它在它下方声明。最后,b3永远不会被任何东西看到,因为条件总是假的。一旦每个对象&#34;超出范围&#34;,b1在函数末尾,b2在循环结束时,系统负责调用析构函数。
这是范围的基础。注意:如果您使用关键字NEW创建指向对象的指针,那么您必须在某处删除该对象。范围仅适用于指针(例如Bar * b_ptr),而不适用于使用NEW创建的对象。
擅长学习蚱蜢是明智的。
答案 1 :(得分:2)
为什么我无法从print函数调用指针并打印出字符串
print()函数的内部不知道*指针是什么,因为它在main()的范围内声明,而不是作为参数传递。您可以将“指针”声明为全局变量,但为什么要在地球上这样做呢?
为什么不反对将指针作为参数传递?
该案中的声明将是
void print(string* pointer){
cout << *pointer << endl;
}
并且调用代码只是
print(pointer);
巧合的是,为什么要制作print static int的返回签名?无效就好了。你没有从函数中返回任何值。
此处的“新”完全没必要
string *pointer = new string;
因为您将指向的资源已存在。 “new”字符串就是这样 - 为新字符串创建空间。
这就够了
string c = "Hello World!";
string *pointer = &c;