C++ 指针和引用作为函数中的参数

C++ 指针和引用作为函数中的参数,c++,C++,对不起,如果我对问题的理解有误,或者我的基本概念不清楚。 这是一个基本的怀疑,但我没有得到任何关于我的怀疑谷歌 疑问:上面的代码片段(我在网上找到)有注释,//strong>/Safe,x不在此范围内,和//Safe,不在此范围内。我不明白为什么这些是安全的,不在范围之内。据我研究和理解,参数有一个局部作用域,当函数返回要调用的控件时,局部变量超出了作用域(这使得返回局部变量不安全)。所以,我的问题是,为什么它们没有超出范围,为什么不安全 int* f(int* x) { (*x)++;

对不起,如果我对问题的理解有误,或者我的基本概念不清楚。 这是一个基本的怀疑,但我没有得到任何关于我的怀疑谷歌

疑问:上面的代码片段(我在网上找到)有注释,//strong>/Safe,x不在此范围内,和//Safe,不在此范围内。我不明白为什么这些是安全的,不在范围之内。据我研究和理解,参数有一个局部作用域,当函数返回要调用的控件时,局部变量超出了作用域(这使得返回局部变量不安全)。所以,我的问题是,为什么它们没有超出范围,为什么不安全

int* f(int* x) {
  (*x)++;
  return x; // Safe, x is outside this scope***
}

int& g(int& x) {
  x++; // Same effect as in f()
  return x; // Safe, outside this scope***
}

int& h() {
  int q;
//!  return q;  // Error
  static int x;
  return x; // Safe, x lives outside this scope
}

int main() {
  int a = 0;
  f(&a); 
  g(a);  
} ///:~
这是针对所有不是局部函数的变量的

您的最后一个案例:-

Safe, x is outside this scope
这里不能返回q,因为q是函数的局部变量,所以当这个函数退出时,q也消失了

然而,静态局部变量作为引用返回是安全的,因为此函数不限制该变量的范围

这是针对所有不是局部函数的变量的

您的最后一个案例:-

Safe, x is outside this scope
这里不能返回q,因为q是函数的局部变量,所以当这个函数退出时,q也消失了


但是,静态局部变量可以安全地作为引用返回,因为此函数不限制该变量的范围。

我在下面为您提供了一些关于变量如何声明以及它们在内存中的位置的注释。我希望这有助于解释他们如何安全返回

int& h() {
  int q;
//!  return q;  // Error
  static int x;
  return x; // Safe, x lives outside this scope
}
这是安全的,因为传入了指向x的指针(内存地址)。既然是这样,这意味着这个函数没有声明原始变量,它来自它的作用域之外

int* f(int* x) {
  (*x)++;
  return x; // Safe, x is outside this scope
}
这是一个类似的场景,其中x的内存地址被传递到函数中,并且没有在函数的作用域中声明

int& g(int& x) {
  x++; // Same effect as in f()
  return x; // Safe, outside this scope
}
这也是安全的,因为“static int x”是在全局变量池中声明的,这意味着它在函数完成后仍然存在

int& h() {
  int q;
//!  return q;  // Error
  static int x;
  return x; // Safe, x lives outside this scope
}

我在下面为您写了一些关于变量如何声明以及它们在内存中的位置的评论。我希望这有助于解释他们如何安全返回

int& h() {
  int q;
//!  return q;  // Error
  static int x;
  return x; // Safe, x lives outside this scope
}
这是安全的,因为传入了指向x的指针(内存地址)。既然是这样,这意味着这个函数没有声明原始变量,它来自它的作用域之外

int* f(int* x) {
  (*x)++;
  return x; // Safe, x is outside this scope
}
这是一个类似的场景,其中x的内存地址被传递到函数中,并且没有在函数的作用域中声明

int& g(int& x) {
  x++; // Same effect as in f()
  return x; // Safe, outside this scope
}
这也是安全的,因为“static int x”是在全局变量池中声明的,这意味着它在函数完成后仍然存在

int& h() {
  int q;
//!  return q;  // Error
  static int x;
  return x; // Safe, x lives outside this scope
}
在这种情况下,只有指针本身才是函数的本地指针。指针指向的
int
不是并且可能是在该函数之外创建的。您只需返回指针,指针将继续指向该对象

int* f(int* x) {
  (*x)++;
  return x; ***// Safe, x is outside this scope***
}
在这种情况下,您将返回对
int
对象的引用,该对象也通过引用传递给函数。因此,该对象不是本地对象

int& g(int& x) {
  x++; // Same effect as in f()
  return x; ***// Safe, outside this scope***
}
在本例中,
x
静态的
,因此它从第一次遇到该声明到程序结束都存在。它不会在函数结束时被销毁

在这种情况下,只有指针本身才是函数的本地指针。指针指向的
int
不是并且可能是在该函数之外创建的。您只需返回指针,指针将继续指向该对象

int* f(int* x) {
  (*x)++;
  return x; ***// Safe, x is outside this scope***
}
在这种情况下,您将返回对
int
对象的引用,该对象也通过引用传递给函数。因此,该对象不是本地对象

int& g(int& x) {
  x++; // Same effect as in f()
  return x; ***// Safe, outside this scope***
}

在本例中,
x
静态的
,因此它从第一次遇到该声明到程序结束都存在。它不会在函数结束时被销毁。

函数中的实际变量超出范围,但它们引用的内存不可用not@BeyelerStudios为什么内存没有被破坏或释放。我的意思是当函数返回控件时,它们会从堆栈中弹出,对吗?但只弹出地址,因为
x
是指针/引用。@leems是对的:它们引用的内存是
a
,它位于
main
中的函数堆栈上,好的!现在很清楚:)谢谢:)函数中的实际变量超出了范围,但它们引用的内存不足not@BeyelerStudios为什么内存没有被破坏或释放。我的意思是当函数返回控件时,它们会从堆栈中弹出,对吗?但只弹出地址,因为
x
是指针/引用。@leems是对的:它们引用的内存是
a
,它位于
main
中的函数堆栈上,好的!现在很清楚:)谢谢:)