C++中引用,指针和数组的比较
C++中引用,指针和数组的比较
引用是c++中的概念,
intvar;
int&ref= var;
以上代码中,**ref是var的引用,var是被引用物,ref相当于var的别名,对ref的任何操作就是对var的操作,所以ref既不是var的拷贝,也不是指向var的指针,其实ref就是**var它自己。
引用的一些规则:
1)引用被创建的同时必须被初始化(指针可以在任何时候被初始化)。
2)不能有Null引用,引用必须与合法的存储单元关联(指针则可以是null)。
3)一旦引用被初始化,就不能改变引用的关系(指针可以随时改变所指向的对象)。
inti= 100;
intj=**200;**
int&k= i;
k=j;//k和i的值都变成了200
语句k=j并不能将k修改成j的引用,只是把k的值改变成200,由于k是i的引用,i的值也被改成了200.
引用的主要功能是传递函数的参数和返回值。传递函数参数和返回值的方式有三种:值传递,指针传递,引用传递。
在值传递**的程序中:**
voidfuncValue(int x){
x=x + 10;
}
intn=0;
funcValue(n);
funcValue中的x是外部变量n的一份拷贝,改变x的值不会影响到n,所以n的值仍然是0。
指针传递的程序:
voidfuncPointer(int*x){
(*x)=(*x) + 10;
}
intn=0;
funcPointer(&n);
funcPointer中的x是指向外部变量n的指针,改变该指针的内容就导致n的值改变,所以n变成了10.
引用传递的程序:
voidfuncRef(int&x){
x=x+10;
}
intn=0;
funcRef(n);
funcRef中的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n。
引用能做的事情,指针都能做,只是引用更安全。因为指针可以毫无约束的去操作内存的任何东西,很危险。
指针和数组很多地方可以互相替换。
数组可能在静态存储区被被创建,也可能在栈上被创建(比如函数内的数组变量),数组名对应一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,特点就是“可变”,所以常用指针来操作动态内存(也即是堆上分配的内存)。
char arry[]=”abcd”;
arry[0] =’A’; //可以通过下标索引修改数组的内容
char *pt=”abcd”;
pt[0]=’A’;//这个操作会引起运行异常,指针虽然可以通过下标访问内容,但是不能修改内容,因为pt指向的是一个常量字符串。
当数组作为函数参数进行传递时,该数组自动退化为同类型的指针。
void func(char a[10]){
cout << sizeof(a) <<endl;
//计算出来的容量是4个字节,而不是10个字节,因为这里得到的是一个指针变量的字节数,指针保持的是地址值,相当于一个init型变量,
在 32 位机器上,一个int型变量占4个字节
}
而char arry[]=”123456789”;
sizeof(array) = 10;这里计算数组的容量是10个字节,其中包括末尾的‘\0’。
还没有评论,来说两句吧...