一、初步了解——指针与取地址

先看程序:

#include<cstdio>

int main(void)

{

	int num = 7;

	int *p = &num;

	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 = &num;

	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 = &num;

	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++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)的更多相关文章

  1. 指针 取地址& 解引用 *

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAACNCAIAAAARutrLAAAgAElEQVR4nOydd3wcxd3/R13uvdsUY2

  2. (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...

  3. JavaScript中指针和地址理解

    个人理解:指针只是指向内存的一个索引:而地址则是内存中确切的位置. 下面是函数中关于指针和地址一个小例子: function sum(num1,num2){ return num1+num2; } a ...

  4. php的foreach中使用取地址符,注意释放

    先来举个例子: <?php $array = array(1, 2, 3); foreach ($array as &$value) {} // unset($value); forea ...

  5. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...

  6. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

  7. 【转】命令行浏览器 curl 命令详解,Linux中访问url地址

    CURL --- 命令行浏览器 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1)二话不说,先从这里开始吧! curl http://www.yahoo.com 回车之后,www. ...

  8. 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别

    转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...

  9. C++中的取地址符(&)

    这个符号特别容易混淆, 因为在C++中, &有两种不同用法: 获得变量地址 引用传递 第一个例子, int main() { std::string s = "Hello" ...

随机推荐

  1. SonarLint插件的安装与使用

    注意:版本要求Eclipse(4.2,3.8)以上,Java3.1.2,JavaScript 2. 一.SonarLint插件的安装方式 1.安装方式一:在线安装 1)Eclipse工具栏选择Help ...

  2. QBC用法

    方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge > ...

  3. linux gcc 编译动态类库(.so)和静态类库(.a)

    linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...

  4. CSS学习笔记(float和盒子模型)

    1.当元素或者是它的包裹层设置了绝对定位或者是浮动,那么margin:0 auto;自动居中的效果就不会实现. 2.盒子模型的三位立体结构图中从第一层到第五层依次为:border.content+pa ...

  5. Unity3D在Windows的全屏和跨屏(双屏)方案

    方案1 unity中2个摄像机场景显示在两个显示器屏幕上(一个窗口跨屏) 1.设置场景中的两个摄像机 摄像机1 摄像机2 2.设置发布的平台及分辨率 3.全屏运行游戏,没有标题栏还可以通过-popup ...

  6. Machine Learning for hackers读书笔记(三)分类:垃圾邮件过滤

    #定义函数,打开每一个文件,找到空行,将空行后的文本返回为一个字符串向量,该向量只有一个元素,就是空行之后的所有文本拼接之后的字符串 #很多邮件都包含了非ASCII字符,因此设为latin1就可以读取 ...

  7. python 练习 7

    #!/usr/bin/python # -*- coding: utf-8 -*- def gcd(x,y): #最大公因子 if x>y:x%=y while x: x,y=y%x,x ret ...

  8. HTML5自学笔记[ 16 ]canvas绘图基础3

    canvas还提供提供了一些动态方法,使图像可以旋转.缩放和移动,与css3中的方法一样. 移动:translate(x,y),x和y为横竖方向的偏移量 旋转:rotate(弧度),弧度=角度*Mat ...

  9. .net 时间戳和日期互转 【转】http://www.cnblogs.com/zhuiyi/p/5307540.html

    .net 时间戳和日期互转 1.时间戳转日期public static DateTime IntToDateTime(int timestamp){ return TimeZone.CurrentTi ...

  10. S2 第二章数据库的实现

    实现增删改查代码 1 select * from student --增加数据 insert into student (name,banji,xuehao) values(,) --修改数据 upd ...