值类型和引用类型区别和基本类型的区别与联系

基本内容/引用类型
引用类型 (reference type)由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。引用类型包括类、接口、委托和装箱值类型。一些计算机高级语言有引用类型这种变量类型。一、C语言中没有引用类型。二、C++中的引用类型:“引用”(reference)是c++的一种新的变量类型,是对C的一个重要补充。它的作用是为变量起一个别名。假如有一个变量a,想给它起一个别名,可以这样写:int &b=a;这就表明了b是a的“引用”,即a的别名。经过这样的声明,使用a或b的作用相同,都代表同一变量。在上述引用中,&是“引用声明符”,并不代表地址。不要理解为“吧a的值赋给b的地址”。声明引用并不开辟内存单元,b和a都代表同一变量单元。注意:在声明引用变量类型时,必须同时使之初始化,及声明它代表哪一变量。在声明一个变量的引用之后,在本函数执行期间,该引用一直与其代表的变量相联系,不能再作为其他变量的别名。下面的用法不对:int a1,a2;int &b=a1;b=a2;//企图使b变成a2的别名(引用)是不行的。例1:#include#includevoid main(){int a=10;int &b=a;//声明b是a的引用,这样a的值变以后,b的值也变;b的值变以后,a的值也跟着变。a=a*a;cout<b=b/5;cout<<<<}有了变量名,为什么还需要一个别名呢?C++之所以增加“引用”,主要是把它作为函数参数,以扩充函数传递数据的功能。我们知道,在C语言中,函数参数传递是单向的,所以例4不能实现两个变量值的交换。C语言中,数组作为函数参数传递的是数组的首地址。C语言中,还可以利用指针变量做形参来实现两个变量值的换,但这种方式需要定义指针变量,需要额外开辟存储空间,来存放地址,见例3。而引用变量不是独立的变量,不单独占内存单元这种方法,实参向形参传送的是实参的地址(但与指针不同的是掉用函数时不需要&),而不是实参的值,见例2。看到&a这种形式时,怎样区分是指针还是引用呢?一般而言,见到前面有类型说明符(如int &a),是引用,而前面没有类型说明符时(如&a)认为是指针。例2://函数参数传递之引用调用#includevoid swap(int &a,int &b){temp=a;a=b;b=}void main(){int i=3,j=5;swap(i,j);cout<<"i="<<cout<<"j="<<}例3://函数参数传递之传地址调用(通过指针)#includevoid swap(int *a,int *b){temp=*a;*a=*b;*b=}void main(){int i=3,j=5;swap(&i,&j);cout<<"i="<<cout<<"j="<<}例4://错误程序例:这个程序不能实现i和j值的交换。#includevoid swap(int a,int b){temp=a;a=b;b=}void main(){int i=3,j=5;swap(i,j);cout<<"i="<<cout<<"j="<<}备注:注意C++ 中引用类型与类的区别。参考文献:东北大学出版社-李一波编着《新概念C语言》218页清华大学出版社陈天华编着《面向对象程序设计与Visual C++教程》73页三、C#中也有引用类型。
区别/引用类型
看实例吧:引用是C++中的概念,初学者容易把引用和指针混淆一起。下面的程序中,n是m的一个引用(reference),m是被引用物(referent)。int &n =n相当于m的别名(绰号),对n的任何操作就是对m的操作。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
引用的规则/引用类型
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。int i = 5;int j = 6;int &k =k = // k和i的值都变成了6;
主要功能/引用类型
引用的主要功能:传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。以下是"值传递"的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。void Func1(int x){x = x + 10;}...int n = 0;Func1(n);cout << "n = " << n =" 0" n =" 0;" n = " << n <void Func3(int &x) { x = x + 10; } ... int n = 0; Func3(n); cout << "n = " <(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。1 int ival = 1092;2 int &re = //ok3 int &re2 = & //错误4 int *pi = &5 int *&pi2 = //ok(2) 一旦引用已经定义,它就不能再指向其他的对象.这就是为什么它要被初始化的原因。(3) const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如double dval = 3.14159;//下3行仅对const引用才是合法的const int &ir = 1024;const int &ir2 =const double &dr = dval + 1.0;上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。例如:double dval = 23;const int &ri =编译器将其转换为:int tmp = // double -> intconst int &ri =同理:上面代码double dval = 3.14159;//下3行仅对const引用才是合法的const int &ir = 1024;const int &ir2 =const double &dr = dval + 1.0;内部转化为:double dval = 3.14159;//不可寻址,文字常量int tmp1 = 1024;const int &ir = tmp1;//不同类型int tmp2 =//double -> intconst int &ir2 = tmp2;//另一种情况,不可寻址double tmp3 = dval + 1.0;const double &dr = tmp3;(4) 不允许非const引用指向需要临时对象的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!int iv = 100;int *&pir = &//错误,非const引用对需要临时对象的引用int *const &pir = &//okconst int ival = 1024;int *&pi_ref = & //错误,非const引用是非法的const int *&pi_ref = & //错误,需要临时变量,且引用的是指针,而pi_ref是一个非常量指针const int * const &pi_ref = & //正确//补充const int *p = &const int *&pi_ref = //正确(5) ********对于const int *const & pi_ref = & 具体的分析如下:*********1.不允许非const引用指向需要临时对象的对象或值int a = 2;int &ref1 =// OK.有过渡变量。const int &ref2 = 2;// OK.编译器产生临时变量,需要const引用2.地址值是不可寻址的值int * const &ref3 = &a; // OK;3.于是,用const对象的地址来初始化一个指向指针的引用const int b = 23;const int *p = &b;const int *& ref4 =const int *const & ref5 = &b; //OKconst引用的语义到底是什么?最后,我们可能仍然不明白const引用的这个const的语义是什么const引用表示,试图通过此引用去(间接)改变其引用的对象的值时,编译器会报错!这并意味着,此引用所引用的对象也因此变成const类型了。我们仍然可以改变其指向对象的值,只是不通过引用下面是一个简单的例子:1 #include234 int main()5 {6 int val = 1024;7 const int &ir =89 val++;10 //ir++;1112cout<<"val="<<<"\n";13cout<<"ir="<14return0;15 }其中第10行,如果我们通过ir来改变val的值,编译时会出错。但是我们仍然可以通过val直接改变其值(第9行)总结:const引用只是表明,保证不会通过此引用间接的改变被引用的对象!另外,const既可以放到类型前又可以放到类型后面,放类型后比较容易理解:string const *t1;const string *t1;typedef string*const pstring cstr1 = &s;就出错了但是放在类型后面不会出错:pstring const cstr2 = &s;
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:7次
参与编辑人数:7位
最近更新时间: 09:05:36
贡献光荣榜查看: 4889|回复: 3
在EXCEL中引用类型有什么区别
阅读权限10
在线时间 小时
我在用excel函数进行运用时,老是搞不清楚相对引用,绝对引用,混合引用有什么区别,应该怎么使用,所以在使用中老犯一些错误,这几个引用在运用中到底有什么区别,该怎么用,比如用countif函数运用时,该怎么区别,
阅读权限100
在线时间 小时
  有一天同学A新到了一个班,被老师安排到了第四行第五个座位,A问老师:“班长是哪个?”。老师回答:“第二行第一个座位的同学”。“学习委员呢?”,“你左边第二个座位的同学”。“体育委员是哪个”,“你前面一行第一个座位的同学”。同学A看了看就都认清了。
  通过这个故事,我们可以看到老师指同学的方法有三种,第一种说明了班长所在的具体位置,第二种说明了学习委员所在的位置和同学A的位置之间的关系,第三种是界于前两种之间。三种表示法虽然不同,但是都能正确地表示所指的人的位置。但三种表示法又是有区别的,第一种表示比较固定,不依赖于A本人的位置;第二种要看A自己所在的位置,A的位置不同,同样的说法所指的人就不同;第三种在行上是依赖于A的位置,在列上是固定的位置。
  在EXCEL中也是一样的,引用其它单元格的方式也是这三种,分别是绝对引用、相对引用和混合引用。
引用方式的表示方法
 1、 绝对引用
    比如引用工作表的第三行第三列单元格,A1样式表示为 $C$3,R1C1样式表示为 R3C3。在任何单元格用这种方式引用都是指第三行第三列的那个单元格。
  2、 相对引用
    如果在$B$2单元格引用$C$3单元格的内容,用相对引用的方式表示: A1样式表示为 C3,R1C1式表示为 R[1]C[1]。如果在$C$2单元格引用$D$3单元格的内容,用相对引用的方式表示: A1样式表示为 D3,R1C1式表示为 R[1]C[1]。如果在$D$3单元格引用$C$2单元格的内容,用相对引用的方式表示: A1样式表示为 C2,R1C1式表示为 R[-1]C[-1]。
    可以看出,同样是表示右下方的单元格,R1C1样式表示的一致性较好;A1样式比较容易写,只要去掉绝对引用的$符号就行了。
  3、混合引用
    又分两种,行绝对列相对和行相对列绝对。其表示方式 A1样式就是在绝对的一方加$,如 $A1、A$1;R1C1样式也同理 如 R1C[-1] 、R[-3]C1。
阅读权限95
在线时间 小时
主要是复制公式的时候会不会随着单元格位置的变化而变化,不会就是绝对引用,变化就是相对引用,行变列不变或列变行不变就是混合引用。
阅读权限10
在线时间 小时
[em07] :victory:楼上的都是强人& &严重的学习了
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师JS的基础类型与引用类型
两种类型:
ECMAScript变量包含两种不同类型的值:基本类型值、引用类型值;
基本类型值:指的是保存在栈内存中的简单数据段;
引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象;
两种访问方式:
基本类型值:按值访问,操作的是他们实际保存的值;
引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值;
两种类型复制
基本类型变量的复制:从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上;
引用类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象;
2. 复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个;
函数参数的传递:
ECMA中所有函数的参数都是按值传递的;
两种变量类型检测
Typeof操作符是检测基本类型的最佳工具;
如果变量值是nul或者对象,typeof
将返回“object”;
Instanceof用于检测引用类型,可以检测到具体的,它是什么类型的实例;
如果变量是给定引用类型的实例,instanceof操作符会返回
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 引用类型 的文章

 

随机推荐