C、C++中引用与指针的区别
1:引用的和指针在概念上的区别
引用是变量的别名,例如
int m;
int &n=m;
引用作为一个别名。它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。则任何对引用的操作即对变量的操作。引用一般是用于处理函数的参数与返回值。
使用规则:
a:引用在创建的时候必须被初始化(指针可以在任何时候赋值)
b:引用必须与一个确定的合法内存单元相关联。不存在NULL引用。
c:一旦引用初始化后,就不能改变引用所指向的变量。
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int a=1;
int b=2;
int &k=b;
printf("%d %d %d %p %p %p\n",a,b,k,&a,&b,&k);
k=a;
printf("%d %d %d %p %p %p\n",a,b,k,&a,&b,&k);
return 0;
}
很明显,引用别名k和b有着相同的地址,会间接性改变b变量。(符合a,b,c规则)
指针是一个变量,其存放的是另外一个是变量的地址,
int m;
int *n=&m;
所以通过指针可以对变量的地址进行直接操作,这样程序员有着更加灵活的选择,但是,指针会带来更多的不安全因素。
因此作为一个变量的指针,其在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。
3:引用于指针在函数传参时的区别:
在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:
指针传递参数本质上是值传递的方式,它所传递 的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实 参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)
而在引用传递过程中,被调函数的形式参数虽然 也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放 的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
二者更加细微的区别有:
●相对于前面介绍的const的用法,没有int& const a这种形式,而const int& a是有的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变。
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查
引用在函数参数传递中的运用。(类似于固定了的static类型,但又可以自由改变)
#include <iostream> using namespace std; void Func(int &n)
{
n++;
cout<<"now the value is "<<n<<endl;
}
int main()
{
int a=10;
Func(a);
Func(a);
}
部分内容来自:http://www.cnblogs.com/lintong/archive/2012/07/28/2613222.html
C、C++中引用与指针的区别的更多相关文章
- C++中引用与指针的区别(详细介绍)
C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...
- C语言学习笔记 (002) - C++中引用和指针的区别(转载)
下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图 ...
- C++ 中引用与指针的区别
1.引用只是变量的一个别名,并不占用内存空间,而指针是一个变量,里面保存着被指向的变量在内存中的地址: 2 引用只能在定义时被初始化一次,之后不可变,而指针可变: 3 引用没有 const,指针有 c ...
- c++中引用和指针的区别
1.指针和引用的主要区别. 引用是为变量起另一个名字(小名),一般在变量初始化时,初始值直接拷贝给变量,定义引用时,把引用(小名)和初始值“绑定”在一起,而不是将初始值拷贝给引用.因为 无法将引用重新 ...
- c++中的引用与指针的区别
http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...
- c++引用与指针的区别
c++引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 指针的权威定义: In a declaration T D where ...
- php中引用和赋值的区别主要在哪里
php中引用和赋值的区别 <pphp 的引用允许用两个变量来指向同一个内容. 相当于他们可以是 不同的名字,却可以指向 同一个 物理空间. 赋值,它实际上意味着把右边表达式的值赋给左边的运算数. ...
- [ZZ]C++中,引用和指针的区别
(1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...
- Java中到底有没有指针;同时注意引用和指针的区别
Java中引用的作用类似于指针,但是有区别:() (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空. (2) 指针可 ...
随机推荐
- Linux学习之lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...
- LNMP卸载
先停掉所有服务 service mysql stop service php-fpm stop service nginx stop killall mysql* killall php-fpm* k ...
- JPA 2.1实例(hibernate 实现)
1.环境准备 1)java se 7 2)maven 3 3)mysql database 2.创建数据库和表结构 首先创建数据库.创建数据库脚本如下: create database jpa; 创建 ...
- Matlab图像直方图相关函数
图像的灰度直方图(H是图像a.bmp的数据矩阵) imhist(H):%显示a的直方图 histeq(H); %将图像a进行直方图均衡化 adapthisteq(H); %将图像a进行直方图均衡化 i ...
- CircleImageView 圆形图片头像实现
package com.view.drop; import android.content.Context; import android.content.res.TypedArray; import ...
- 软件测试学习日志————round 0 An impressed error in my past projects
在初学各种语言时总会出现各种错误,比如main携程mian.忘了加各种库,打错字等等等等.虽然这些错误后面看来很幼稚,但是有的时候真的会让人印象很深刻. 在初学JavaScript时,我对JavaSc ...
- [原创]C语言里为何会有“2+2=5”的结果
原文链接:C语言里为何会有“2+2=5”的结果 写这篇原创文章是因为看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,其中C语言是这样实现的: int main() { ″; // ...
- Oracle EBS-SQL (SYS-18):检查系统安装的各个表是否打开(PJM%).sql
select status, trigger_name from all_triggers where trigger_name like 'PJM%'; ALTER TRIGGER PJM_ORG_ ...
- 十九、Android Activity初探
原文:十九.Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供 ...
- 神器之“c#反编译工具“
1. ".net reflector"本人正在使用,下载地址 2."ILSpy"没实用过,可是听杨中科老师说挺好. 有了这个,妈妈再也不用操心我看不到别人封装好 ...