如何从方法中打印指针的值?

时间:2015-12-04 16:45:04

标签: c++ pointers

基本上我有两个函数,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;
}

2 个答案:

答案 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;