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

How do I print the value of a pointer from within a method?

本文关键字:指针 打印 方法      更新时间:2023-10-16

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

您需要将指针传递到打印函数中,因为它不是全局的。

static int print(string* pointer)

这应该很好用。

此外,您的线路存在内存泄漏

string *pointer = new string;

并使用进行调用

print(pointer);

分配并从不删除新的字符串对象。你可能想使用

string *pointer = nullptr;

相反。此外,using namespace <whatever>可能会导致问题。确保你这样做是有充分理由的,不要避免键入一些额外的字符。

编辑:

正如这里所建议的,这是一个范围的快速缩小。

查看范围的方式有点像对象的生命以及谁能看到它。你创建的对象(不使用new)有一个范围,直到它从代码块中掉出来。无论是块、函数、条件语句还是循环。此外,该对象只能由创建它的下面的代码看到。

void foo()
{
  Bar b;
  /** really cool code **/
}

在这里,Bar类型的对象b可以被整个函数看到。一旦函数结束,b就会"脱离作用域",并自动调用析构函数。注意:用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只能通过for循环中的"同样酷的代码"来查看。"酷代码"看不到它,因为它是在下面声明的。最后,b3永远不会被任何东西看到,因为条件总是false。一旦每个对象"超出范围",b1在函数末尾,b2在循环末尾,系统就会负责调用析构函数。

这是范围的基础。注意:如果您曾经使用关键字NEW来创建指向对象的指针,那么您必须在某个位置删除该对象。作用域仅适用于指针(比如Bar*b_ptr),而不适用于使用NEW创建的对象。

蚱蜢,你最好好好学习。

为什么我不能从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;