引用和指针的区别
2015-08-30 20:44
281 查看
指针和引用的区别:
一:定义和性质区别:
1、指针是一个变量,这个变量里存的是一个地址,指向内存的一个存储单元;而引用和原来的变量是同一个东西,只是原变量的一个别名;
eg:int a =1; int *p=&a; int &b = a; //&b 和 &a 是相等的,说名引用和原来的变量其实就是一个东西;
2、 可以有const指针,但没有const引用;
3、指针可以有多级,但是引用只有一级;
4、指针的值可以为空,表示不指向任何变量;但是引用的值不能为空,并且引用在定义的时候必须进行初始化;
5、指针的值在初始化后可以改变,但引用在进行初始化后就不能再改变了,即要求“从一而终”;
6、sizeof (引用) :得到所指向变量类型所占内存大小;sizeof(指针):得到的是指针变量类型的大小;
7、指针和引用的自增(++)运算意义不一样;p++表示p+sizeof(int);b++表示变量内容加1;
二:作为函数参数进行传递时的区别:
1、指针作为参数进行传递:
eg:
即:当把指针作为参数进行传递时,实际上也是将实参的一个拷贝传递给形参;
2、将引用作为函数的参数进行传递:
将引用作为函数参数进行传递时,实质上传递的是实参本身,因此对形参的修改其实也就是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
所以在上面的代码中,如果想要是传地址引用的话,就要改成 test(int * &p)
一:定义和性质区别:
1、指针是一个变量,这个变量里存的是一个地址,指向内存的一个存储单元;而引用和原来的变量是同一个东西,只是原变量的一个别名;
eg:int a =1; int *p=&a; int &b = a; //&b 和 &a 是相等的,说名引用和原来的变量其实就是一个东西;
2、 可以有const指针,但没有const引用;
3、指针可以有多级,但是引用只有一级;
4、指针的值可以为空,表示不指向任何变量;但是引用的值不能为空,并且引用在定义的时候必须进行初始化;
5、指针的值在初始化后可以改变,但引用在进行初始化后就不能再改变了,即要求“从一而终”;
6、sizeof (引用) :得到所指向变量类型所占内存大小;sizeof(指针):得到的是指针变量类型的大小;
7、指针和引用的自增(++)运算意义不一样;p++表示p+sizeof(int);b++表示变量内容加1;
二:作为函数参数进行传递时的区别:
1、指针作为参数进行传递:
eg:
void test(int *p) { cout << "in test():" << p << ", " << &p << endl; // in test(): 0018F7A8, 0018F6C4 *p=999; cout << p << " " << *p << endl; } int main(void) { int b = 1; int *p = &b; cout << "in main():" << p << ", " << &p << endl; // in main(): 0018F7A8, 0018F79C test(p); cout << "after test():" << p << ", " << &p <<", "<<*p<<endl; // after test():0018F7A8, 0018F79C, 1
cout<<*p<<endl; //999 system("pause"); return 0; }从上面可以看出,将指针作为参数进行传递时,实际上也是值传递,传递的值是指针的地址;即当调用test(p)时,系统会在栈中新开辟一个内存空间,空间地址为0018F6C4,然后将p的值0018F7A8放入到这个内存空间中,这个就代表着test函数中的形参p,即p的内容为0018F7A8,地址是0018F6C4,和main函数中test实参的地址是不一样的;
即:当把指针作为参数进行传递时,实际上也是将实参的一个拷贝传递给形参;
2、将引用作为函数的参数进行传递:
将引用作为函数参数进行传递时,实质上传递的是实参本身,因此对形参的修改其实也就是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
所以在上面的代码中,如果想要是传地址引用的话,就要改成 test(int * &p)
相关文章推荐
- poj 2503 Babelfish(字典树·翻译)
- Note For Linux By Jes(20)-Linux 核心编译与管理
- 【J2SE】配置JDK环境变量
- 关于分布式系统的数据一致性问题(二)
- 2 JavaWeb之Mac下配置Tomcat
- Idol之坑
- UVA 1252 十五 Twenty Questions
- JAVA练级之路(二)--- JAVA入门
- 5 个很好的 Python 面试题
- Java中垃圾回收和静态类型
- DFS求迷宫问题
- Note For Linux By Jes(19)-Linux 备份策略
- Jquery对象的文档处理,CSS和事件
- C#【堆与栈 值类型 引用类型】
- UVA 1291 十四 Dance Dance Revolution
- js 显示现在时间 自制函数
- JavaScript学习笔记3-JavaScript定义对象的四种方式
- 15个 MySQL 基础面试题,DBA 们准备好了吗?
- 关于分布式系统的数据一致性问题(一)
- Android控件之TimePickerDialog、DatePickerDialog和自定义DialogPopupWindow与NotificationManager