详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
一、初步了解——指针与取地址
先看程序:
#include<cstdio>
int main(void)
{
int num = 7;
int *p = #
printf("%d 的地址是 %p\n", num, p);
return 0;
}
上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。
所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)
二、如何使用指针?——解引用与指针赋值
#include<cstdio>
int main(void)
{
int num = 7;
int *p = #
printf("数值%d所在的地址是 %p\n", num, p);
printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);
*p = 100;
printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);
return 0;
}
注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。
我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)
当然,我们也可以给指针p赋值,使其指向另外一个地址:
#include<cstdio>
int main(void)
{
int num = 7, another = -5;
int *p = #
p = &another;
printf("%d\n", *p);//-5
return 0;
}
三、引用
从某种意义上来说,引用完全有别于上面说介绍的内容:
#include<cstdio>
int main(void)
{
int val = 7, val2 = 999;
int &refval = val, &refval2 = val2; ///引用必须要初始化,使其绑定到一个变量上
///修改引用的值将改变其所绑定的变量的值
refval = -12;
printf("%d %d\n", val, refval);//-12,refval的值和val一样
///将引用b赋值给引用a将改变引用a所绑定的变量的值,
///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上
refval = refval2;
printf("%d %d\n", val, refval);//999
return 0;
}
四、补充
a)指向指针的指针:
#include<cstdio>
int main(void)
{
int val = 7;
int *p = &val;
int **p2 = &p;///**声明一个指向指针的指针
printf("val的值为%d %d",*p,**p2);///**p2为两次解引用,可看做*(*p2)
return 0;
}
由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。
b)指针与数组:
指针和迭代器非常像,我们可以说指针就是数组的迭代器:
#include<cstdio>
int val[100];
int main(void)
{
for (int i = 0; i < 100; ++i)
val[i] = i;
int *p = val;///等价于int *p = &val[0];
///数组的变量名就是一个指针
printf("%d\n", *p); ///指针p指向val的第一个元素,即val[0]
int t = 100;
while (t--)
///可以直接对指针进行加减运算,就和迭代器一样
printf("%d\n", *(p++));///输出0~99
///指针可以做差:
int *p2 = &val[10], *p3 = &val[20];
printf("%d\n", p3 - p2); //10
printf("%d\n", p2 - p3); //-10
///还可以比比较大小:
printf("%d\n", p2 < p3 ? p3 - p2 : p2 - p3); //10
return 0;
}
对于多维数组,只要把指向指针的指针理解好了就行:
#include<cstdio>
int val[100][100];
int main(void)
{
val[2][1] = 666;
///如何用指针取出val[2][1]?
printf("%d", *(*(val + 2) + 1));
return 0;
}
详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)的更多相关文章
- 指针 取地址& 解引用 *
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAACNCAIAAAARutrLAAAgAElEQVR4nOydd3wcxd3/R13uvdsUY2
- (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...
- JavaScript中指针和地址理解
个人理解:指针只是指向内存的一个索引:而地址则是内存中确切的位置. 下面是函数中关于指针和地址一个小例子: function sum(num1,num2){ return num1+num2; } a ...
- php的foreach中使用取地址符,注意释放
先来举个例子: <?php $array = array(1, 2, 3); foreach ($array as &$value) {} // unset($value); forea ...
- C语言中指针*p[N], (*P)[N],及**p的区别
在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...
- oracle和sql server中,取前10条数据语法的区别
在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...
- 【转】命令行浏览器 curl 命令详解,Linux中访问url地址
CURL --- 命令行浏览器 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1)二话不说,先从这里开始吧! curl http://www.yahoo.com 回车之后,www. ...
- 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别
转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...
- C++中的取地址符(&)
这个符号特别容易混淆, 因为在C++中, &有两种不同用法: 获得变量地址 引用传递 第一个例子, int main() { std::string s = "Hello" ...
随机推荐
- 别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
局域网内要访问服务器上部署的tomcat,必须关闭防火墙吗? 不一定. 如果是需要使用 IP:端口号(ip:port)来访问,可以做以下设置(这里仅是说的tomcat访问). 首先在服务器的控制面板中 ...
- Java / JVM CPU 利用率高 - 诊断方法 1 - Thread Dump 结合 OS 诊断
IBM AIX Java 1. topas 命令定位 CPU 使用高的进程,比如下面 PID 614852 Name PID CPU% java 614852 ...
- BOM头的来源
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM).它是一串隐藏的字符,用于让记事本等编辑器识别 ...
- ajax中基本兼容各浏览器的XMLHttpRequest的创建
function createXHR(){ var xhr = null; if(window.XMLHttpRequest){//判断当前浏览器是否支持XMLHttpRequest xhr = ne ...
- dede在线留言
登录dede后台,在[核心]---[频道维护]---[自定义表单]中根据需要创建需要的表单. 点击[增加新的自定义表单],添加在线留言表单.确定即可. 注意: ①在这里只需要修改[自定义表单名称: ...
- Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五)
http://www.xuanyusong.com/archives/3727 感谢楼下的牛逼回复更正一下,我表示我也是才知道.. 其实不需要实例化也能查找,你依然直接用GetComponentsIn ...
- DirectX中的纹理及其创建
正如大多初学者会遇到一个问题, 导入的图片为何不是原来的尺寸?例如800*600的实际上通过D3DXCreateTextureFromFile后变成的是1024*1024,即宽和高默认都会自动扩展为2 ...
- javascript图片切换
JavaScript 图片滑动切换效果 作者:cloudgamer 时间: 2009-09-25 文档类型:原创 来自:蓝色理想 第 1 页 JavaScript 图片滑动切换效果 [1] 第 2 页 ...
- nodeschool.io 7
~~ HTTP CLIENT ~~ Write a program that performs an HTTP GET request to a URL provided toyou as the f ...
- Qt之QSS(QDarkStyleSheet)
简述 关于样式,前面介绍了很多内容,下面分享一个深色样式表,很值得借鉴! 简述 效果 QSS 更多参考 效果 QSS /* * The MIT License (MIT) * * Copyright ...