怎么在js把函数赋值给变量中修改js把函数赋值给变量外变量的值

4428人阅读
VC编程相关(8)
先看一段代码:
#include &iostream&
void foo(char *p)
&& p = &after foo()&;
void main()
& &char *p = &before foo()&;
&& foo(p);&&&&
&& cout &&p &&&&
如果你指望函数foo能帮你改变p的值,那你就错了。因为指针也是变量,它在函数调用过程中也是传值调用的(C中函数参数都是传值调用)。函数foo中的p只是局部变量,它的作用域仅在子函数中。上面这段代码其实和下面这段效果是类似的:
#include &iostream&
void foo(int i)
void main()
&& int i = 0;
&& foo(i);&&&&&
&&&cout &&i&&&&
这是foo函数显然不会修改i的值,对于第一段代码的指针,也是同样的道理。都是变量的传值调用,一个是整形变量,一个是指针变量而已。
那么,如何修改代码才能得到我们想要的效果呢?有三种方法。
一、使用return
#include &iostream.h&
char* foo()
&char* p = &after foo()&;
void main()
&char* p = &before foo()&;
&p = foo();
&cout&&p&&
二、使用指针引用
#include &iostream&
void foo(char *& q)
&&&q = &after foo()&;
void main()
& &char *p = &before foo()&;
&& foo(p);&&&&
&& cout &&p &&&&
该程序将p的地址传给foo,则p=&q,而p是字符串变量的内存地址,那么&q也是字符串变量的内存地址,则q也是指向该字符串变量所在内存的指针。
简单的说foo中的q这时是p的引用(别名),q和p共享同一个内存空间。这时在foo中修改q指向的内存空间的字符串内容,main中p的值当然也随之变化。
三、使用指向指针的指针
#include &iostream.h&
void foo(char ** p)
&& *p = &after foo()&;
void main()
&& char **p = &before foo()&;&&
& &foo(p);&&&&
&& cout &&*p&&&&
main中p是指向指针的指针,即它的值的值是指向字符串变量内存的指针的地址,在foo中*p就表示该指针,即字符串变量内存的地址。所以修改*p的值自然可以修改该内存的内容。
下面一段程序使用了同样的原理:
#include &iostream.h&
void foo(char ** p)
&& *p = &after foo()&;
void main()
&& char *p = &before foo()&;&&
&& foo(&p);&&&&
&& cout &&p&&&&
引用和指针的区别:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:311203次
积分:2333
积分:2333
排名:第16474名
原创:28篇
转载:27篇
评论:93条
(2)(1)(3)(23)(4)(3)(16)(2)(1)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
c 语言里怎么定义一个全局变量,使其在调用它的每个函数里都是最初的值?就是说,每个函数对它的改变只限于函数作用域内
艹有灰机8W
扫二维码下载作业帮
2亿+学生的选择
你定义的时候用static比如static int a = 8;但是定义了static之后就不能改变它的值要想在函数内部改变它就再定义一个数据,使它等于全局变量比如void func(void){int b = //这里你得到的肯定是a的最初值这时候你随便去改变b的值都没关系.a还是a;}
哎呀,你一说,概念有点像起来了,但是我并不想多定义变量哪怕是在函数里,仅仅利用一个全局的变量,函数对它的改变只限于函数里。我只想问下c里存在这样功能实现方式?
你想改变全局变量的值右局限于函数内
那只能是先把初始值记录下来,到最后再给它赋值回去。
但是我认为这还不如再定义一个变量将值拷贝过来来的合适呢?
这是语言的局限性
程序小无所谓,如果调用的概率高每次定义变量不如使用一个划算, register变量呢?
register 是为了提高效率,但是用register是有潜在威胁的,用多个register时候很可能部分被系统吃掉了
为您推荐:
扫描下载二维码1882人阅读
&&&&&&& mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
  下面是一个小例子:
class ClxTest
  void Output()
void ClxTest::Output() const
 cout && &Output for test!& &&
void OutputTest(const ClxTest& lx)
 lx.Output();
  类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。
  函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。
  如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。
  下面是修改过的代码:
class ClxTest
  ClxTest();
  ~ClxTest();
  void Output()
  int GetOutputTimes()
 private:
  mutable int m_iT
ClxTest::ClxTest()
 m_iTimes = 0;
ClxTest::~ClxTest()
void ClxTest::Output() const
 cout && &Output for test!& &&
 m_iTimes++;
int ClxTest::GetOutputTimes() const
 return m_iT
void OutputTest(const ClxTest& lx)
 cout && lx.GetOutputTimes() &&
 lx.Output();
 cout && lx.GetOutputTimes() &&
  计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:147738次
积分:1878
积分:1878
排名:千里之外
原创:33篇
转载:14篇
评论:29条
(1)(1)(2)(2)(3)(1)(1)(9)(7)(11)(12)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 函数自变量的取值范围 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信