您的当前位置:首页c++中int详解

c++中int详解

2021-11-22 来源:爱问旅游网
c++中int详解

1、int;

int是C++关键字,表⽰整型,其⼤⼩是32位有符号整型,表⽰的范围是-2,147,483,648 到 2,147,483,647;在声明和定义变量时使⽤,它表⽰的意思是所声明或所定义的变量为整型变量。如果其⽤于函数参数时,其传递⽅向为值传递,即只能将实参的值传递给形参,⽽不能将形参的值传递给实参。

例如:swap函数,通过这种⽅式去进⾏交换两个数是⽆法达到⽬的的。#include

using namespace std; void swap1(inta,intb){

int tmp; tmp = a; a = b; b = tmp; }

int main(){ int a = 1; int b = 2; swap1(a, b);

cout<<\"a = \"<结果为:a=1 b=2

因为传递的⽅式为值传递(单向传递);

2、int&;

这⾥的&不是取地址符号,⽽是引⽤符号,引⽤是C++对C的⼀个重要补充。变量的引⽤就是变量的别名,讲的通俗⼀点就是另外⼀个名字,⽐如:“张三这个⼈在家⾥,⽼爸⽼妈叫他三娃⼦,那么这个三娃⼦就是指张三这个⼈,如果叫张三去做某事,就是叫三娃⼦去做某事,这两个名字指的是同⼀个⼈。”同样可以理解如果变量b是变量a的引⽤ 那么⽆论a,b中任何⼀个值改变,另外⼀个也相应的改变,在声明⼀个引⽤时,必须同时使之初始化,即声明它代表哪⼀个变量。请注意:由于引⽤不是独⽴的变量,编译系统不给它单独分配存储单元,因此在建⽴引⽤时只有声明没有定义,只是声明它与原有的某⼀变量的关系。在声明⼀个变量的引⽤后,在本函数执⾏期间,该引⽤⼀直与其代表的变量相联系,不能再作为其他变量的别名。说得简单点:张三和三娃⼦是指同⼀个⼈,不能李四也叫三娃⼦,如果可以这样,叫三娃⼦去做什么,是叫李四呢还是张三呢,这就会乱套了。所以在C++中⼀个引⽤变量只能对应⼀个原始的变量,不能对应两个或多个原始的变量;

下⾯简单说明引⽤:

a)声明引⽤时必须指定它代表的是哪⼀个变量,即对它初始化。

int &a=b;这样是声明a是变量b的引⽤如果是int &a;这样就是错的,没有指定a代表哪⼀个变量。

b)引⽤与其所代表的变量共享同⼀内存单元,系统并不为引⽤另外分配存储单元;

这个应该好理解;就像前⾯所说的,张三和三娃⼦都是同⼀个⼈,三娃⼦只是张三的别名。因此,对于 int &a=b;这个例⼦来说,要输出a和b 的地址,肯定是相同的。

c)怎样区分&是引⽤还是取地址符呢?⽅法是:判断&a这样的形式前是否有类型符即

int &a=b;如果有类型符(int)则是引⽤,否则是取地址运算符。

d)对引⽤的初始化,可以是⼀个变量名,也可以是另⼀个引⽤。

换句话说:张三的别名可以是三娃⼦,三⼩⼦……及其他多个别名⽽三娃⼦也可以有其他的别名,⽐如说:⽼三,⼩三等

⽤程序可以这样:

int a=1; //这⾥是定义⼀个整形变量int &b=a;//声明b是整型变量a的别名int &c=b;//声明c是整型引⽤变量b的别名int &d=a;//声明d是整型变量a的别名

e)引⽤初始化后不能再被重新声明为另⼀变量的别名

即三娃⼦既然是指张三这个⼈,就不能让其他⼈也叫三娃⼦即⼀个别名只能对应⼀个原始变量,但是⼀个原始变量可以有多个别名,⽽且别名也可以由⾃⼰的别名。

3、int & 引⽤的⽤途

C++中增加引⽤主要是作为函数参数,进⾏数据传递的功能;

我们知道如果⽤变量名作为实参,其传递⽅向是单向的,⽽⽤引⽤作为实参其传递⽅向是双向的;也许你会问,在c语⾔中不是有指针吗,⽤指针进⾏参数传递不也是双向的吗?其实其本质上也是值传递,只不过是将变量的地址传给指针,通过指针获取变量的值,这样做虽能得到结果,但通过指针运算符去访问有关变量,⽐较⿇烦。

下⾯分析⼀下使⽤引⽤和使⽤指针变量作为函数形参的不同(以swap函数为例):

1、如果使⽤引⽤,则不必在swap函数设⽴指针变量,指针变量要另外开辟内存单元,其内容是地址。⽽引⽤不是⼀个独⽴的变量,并不占⽤内存单元

2、在main函数中调⽤swap函数时实参不必再变量名前加&以表⽰地址,系统传递的是实参的地址不是实参的值。

3、使⽤指针变量时,为了表⽰指针变量所指向的变量,必须使⽤指针运算符*,⽽使⽤引⽤时,引⽤就代表该变量,不必使⽤指针运算符*;

4、⽤引⽤完成的⼯作,⽤指针也能完成。但引⽤⽐指针的使⽤直观、⽅便,直截了当,不必“兜圈⼦”,容易理解。有些过去只能⽤指针来处理的问题,现在可以⽤引⽤来代替,从⽽降低了程序设计的难度。

4、引⽤的进⼀步说明

1、不能建⽴void类型的引⽤。

因为任何实际存在的变量都是属于⾮void类型的,void的含义是⽆类型或空类型,void只是在语法上相当于⼀个类型⽽已。

2、不能建⽴引⽤的数组。

如:char c[6]=\"hello\";  char &rc=c;//错误

因为数组名是数组⾸元素的地址,本⾝不是⼀个占有存储空间的变量。

3、可以将变量的引⽤的地址赋给⼀个指针,此时指针指向的是原来的变量。

这句话可以这样说:将引⽤变量的地址赋给⼀个指针,此时指针指向的是引⽤变量,相当于指向原来的变量

如:int a=2;

  int &b=a;//这个声明语句中的&是⼀个引⽤

  int *p=&b;//这个指针初始化语句中的&是取地址运算符  int *p=&b 等价于 int *p=&a;

但是不能定义指向引⽤类型的指针变量,不能写成int & *p=&a;//企图定义指向引⽤类型的指针变量p,错误因为引⽤不是⼀种独⽴的数据类型,因此不能建⽴指向引⽤类型的指针变量。

4、可以建⽴指针变量的引⽤

如:int i=5;  int *p=&i;

  int * &pt=p;//建⽴指针变量p的引⽤pt

引⽤变量pt代表⼀个int *类型的数据对象(即指针变量)

5、可以⽤const对引⽤加以限定,不允许直接改变该引⽤的值,但是可以改变原变量的值去改变引⽤的值;

如:int i=5;

  const int &a=i;

  a=3;//错误,因为引⽤a是const int 类型不能直接改变引⽤的值

但是可以修改 i=3; 此时输出i和a都是3:

6、可以⽤常量或表达式对引⽤进⾏初始化,但此时必须⽤const作声明。

如:int i=5;

  const int &a=i+1;

此时编译系统是这样处理的:⽣成⼀个临时变量,⽤来存放该表达式的值,引⽤是该临时变量的别名、系统将“const int &a=i+1;”转换为  int temp=i+1;

  const int &a=temp;

临时变量是在内部实现的,⽤户不能访问临时变量;⽤这种办法不仅可以⽤表达式对引⽤进⾏初始化,还可以⽤不同类型的变量对之初始化;

  double d=3.1415926;  const int &a=d;以上等价为:

  double d=3.1415926;  int temp=d;

  const int &a=temp;

如果在上⾯不⽤const则会发⽣错误  double d=3.1415926;

  int &a=d;//未加const,错误

为什么?因为如果可以这样做,那么修改引⽤a的值(如a=3.56),则临时变量temp的值也变为3.56,即修改了临时变量temp的值,但不能修改变量d的值,这往往不是⽤户所希望的,即存在⼆义性。与其允许修改引⽤的值⽽不能实现⽤户的⽬的,还不如不允许修改引⽤的值。这就是C++规定对这类引⽤必须加const的原因。

因篇幅问题不能全部显示,请点此查看更多更全内容