C++中的指针(*)、引用(&)、const详解(一、定义变量)
一、前言
本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性。
二、符号的多义性
我们定义一个变量 int a=10;那么我们可以看到它(基本类型)由声明符列表+变量名(a)组成;指针和引用实际是复合类型,它的声明符列表由多个类型构成(int *,int &),其中它最终的类型由紧靠它的那个类型决定。
1、*可以表示变量是指针类型,通常紧跟声明的变量,例如int *a;
2、*可以表示解引用,通常用在取单独的指针所指向的对象,前提对象必须是指针类型,例如*a;
3、&可以表示取地址符,通常用在表达式右侧紧跟一个变量如 int *a=&b,它要赋值的对象必须是指针型的变量;
4、&可以表示引用,也就是别名int &a=b,一般在等号左侧(引用型变量一般必须初始化);
5、&&右值引用(一般要给它赋值的对象是即将消失的临时变量),&一般称为左值引用
6、&的其他用法,比如作为运算符且、与等(结合语境很容易知道,不做展开)
三、什么是指针
指针的本质是一个对象,存放的是变量的地址,例如,我有十个箱子,其中一箱有珠宝,我写了个小纸条(纸条内容是哪个箱子放珠宝),放在了确定的箱子中,这个箱子就是指针对象,这个箱子贴个标签就是指针类型的。
看一段代码
int a=;
int *b = &a; a的地址给整型指针b std::cout << b;
std::cout << std::endl;
std::cout << *b; return ;
}
我的输出结果
查看内存,确实b的值为上者,之歌地址里面存了一个10
注意:
指针指向对象的类型必须要个匹配,否则发生错误
指针的状态有指向对象、指向紧邻对象控件的下一位置、空指针(为了避免错误一般指针变量赋值nullptr)、无效指针
*p是解指针
**p值指针的指针,一般的指针符号*的多少无限制
int *p=&a等效int *p=nullptr,p=&a,标识对指针赋值,*p=10表示对p指向的对象赋值
赋值改变的永远是左侧对象
void*是特殊指针们可以存放任意类型 可以通过static_cast推导取出来
三、什么是引用
引用的本质是别名(其实是对指针的封装),不是一个对象。例如我们有个同事叫王伟,我叫他小王,小王就是引用,而不是小王的克隆人,户口本上也没有小王。
定义引用时,程序把引用和它的初始值绑定(bing),初始化完成,不能再绑定。
注意:
引用必须类型严格匹配,常量指针和基类-动态类型变化除外
引用只能绑定在对象上,不能是字面值(10等数字)和表达式
不存在引用的引用
非常量引用的初始值必须是左值,即不能是表达式得出的临时值和字面常量(10)
看一段代码
int main()
{
int a=;
int &b = a; std::cout << a;
std::cout << std::endl;
std::cout << b; std::getchar();
return ;
}
结果是10 10
四、什么是const常量
一个变量被const修饰,表示它初始化后不能再变,它存在全局区,其右侧可以使一个常量,也可以是变量,还可以是表达式,可以使左值也可以是右值,只要能初始化就ok,它只是限定了定义的量不能再变。
const int a=10;a=20;会触发编译器报错
五、几种组合
左值持久,右值短暂(右值是临时变量或字面常量),左右的初始含义:右值是只能出现在右侧,左值是既可以左又可以右
a、指针的指针**p
b、不存在引用的引用(&&p)
c、指针的引用(*&p)标识给指针类型的变量起了个别名,最终什么类型看紧邻变量的限定符,本例中是&
int x = 10;
int *a=&x;
int *&b = a;
d、不存在引用的指针(&*p),因为引用不是对象
e、常量指针 const int *p;标志这个指针不能变(地址不能变),但是这个量管不着(const不直接修饰变量,成为底层const,否则称为顶层const,顶层的不可以变)
int a=10;
const int *b = &a;
a = 20;
f、指针常量 int * const p;p不能被重新赋值
g、常量引用 const int &p;p不能被赋值
h、引用常量 ,可以赋值
int a=10;
int & const b = a;
b = 20;
有不懂的伙伴可以加群交流:568055323
C++中的指针(*)、引用(&)、const详解(一、定义变量)的更多相关文章
- C++中this指针的用法详解
转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...
- C++中this指针的用法详解(转)
原文地址:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影 ...
- 【转】C++中this指针的用法详解
1.this指针的用处 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象 ...
- [转载] C++中this指针的用法详解
摘自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- C++之值传递&指针传递&引用传递详解
C++之值传递&指针传递&引用传递详解 目录 C++之值传递&指针传递&引用传递详解 1.函数基础 2.值传递 3.指针传递 4.引用传递 1.函数基础 一个函数由以下 ...
- Java中只有值传递,(及值传递与引用传递详解)
首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...
- **Python中的深拷贝和浅拷贝详解
Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要 ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- 前端后台以及游戏中使用Google Protocol Buffer详解
前端后台以及游戏中使用Google Protocol Buffer详解 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更 ...
随机推荐
- smali与baksmali用法-基于2.2.2版本
下载地址:https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads 反编译dex java -jar baksmali-2.2.1 ...
- PAT_A1075#PAT Judge
Source: PAT A1075 PAT Judge (25 分) Description: The ranklist of PAT is generated from the status lis ...
- 前端(十六)—— JavaScript盒子模型、JS动画、DOM、BOM
JS盒子模型.JS动画.DOM.BOM 一.JS盒模型 1.width | height parseInt(getComputedStyle(ele, null).getPropertyValue(' ...
- JDK8新特性之接口默认方法与静态方法
接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...
- 第一周任务Largest Submatrix of All 1’s
Largest Submatrix of All 1’s Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 9512 Ac ...
- idea一直在copying resources或者一直在build,卡住不动,问题已解决
IDE在启动项目的过程中,一直copying,或者是build一直卡住,需要在modules中配置下,把target文件夹移出resource folder 同时,在此之前,我还屏蔽了项目中pom.x ...
- Java 整型数组只有一个整数是只出现一次的,其余都出现两次
package writtenExamination; /** * @author lindaZ * @date 2015年10月22日 * @todo 找出数组中仅出现一次的数,其余数字出现两次 * ...
- 通过actionlib控制jaco机械臂
为了安全,先写一个简单控制三个手指的程序: 根据驱动包内kinova_fingers_action.cpp服务器写客户端程序 #include <ros/ros.h> #include & ...
- sqlldr details
https://www.csee.umbc.edu/portal/help/oracle8/server.815/a67792/ch05.htm Loading into Empty and Non- ...
- JMeter学习篇(一):测试实例讲解
1.JMeter的下载与安装 Jmeter官方下载地址:http://jmeter.apache.org/download_jmeter.cgi,下载jmeter是一个zip压缩包,解压后,直接运行a ...