传统的指针概念教科书上已经写的很详细了,这里作为一些补充

在声明一个指针变量的时候

double  *ptr;

这是声明了一个ptr的指针变量,ptr本身是地址,它的数据类型是double  *,在变量声明的时候,指针跟数据类型在一起。所以无法这样写

double  *ptr=42;

因为你把常数赋给了一个地址变量ptr;

*ptr = 42;

这样赋值是可以的, 但是这里的*ptr的上面变量声明double  *ptr中的*ptr有什么关系呢? 其实没有关系,两者一毛钱的关系都没有,

*ptr里的*变成了个功能性的指向!也就是指向ptr地址的真正变量所在地, 所以当然可以赋值了。

如果这样声明变量

double  ptr2=42;

ptr是实际的值, 既然是实体,总的有个地址存

&ptr则获取这个值的地址。

ptr = &ptr2;

这样是可以的。就讲到这里,重要的是澄清double  *ptr与*ptr的关系,关系一明了 ,其他的一切都很容易推理出来。

    double dd = 3.12;

    double & ff =dd;
std::cout<<ff<<endl;
std::cout<<&ff<<endl; std::cout<<dd<<endl;
std::cout<<&dd<<endl; double fff =dd;
std::cout<<fff<<endl;
std::cout<<&fff<<endl; std::cout<<dd<<endl;
std::cout<<&dd<<endl;

看这一句,double & ff =dd; double &是ff的数据类型,赋值之后,发现讲dd的地址赋给了ff的指针,这句话有点绕,比如我们写成这样 *ff=&dd, 程序就会报错,因为ff本来是实体,就不可以在指向了,那到底怎么理解double &数据类型呢?

现在我们定义:

double *ffPoint = &ff;

那double & ff =dd;可以理解为ffPoint = &dd; 这样ff的本质没有改变,还是实体变量,但是地址却成了dd的地址,现在的ff成了dd的镜像,改变dd和ff中任何一个,dd和ff都会同时变化。 double & ff =dd;代替了double *ffPoint = &ff;这个过程,这样可以省去创建ffPoint指针变量,这样虽然很简洁,但是却变得让新手难以理解,产生混淆。 也可以这样理解, 看这一段程序:

    double dd = 3.12;
double df = 3.14;
&df = &dd;

执行到第三行会报错,因为等号左边不允许出现&, 而*却可以出现在等号的左边;但是我们想将dd的地址赋给df的地址怎么办呢?
ok,修改第二行为:double &df = dd;
怎么样,是不是很绕??转变一下思维吧,其实就是将想象中的&df = &dd;变成double &df = dd;为什么c/c++要这样设计,这也不是我们所能左右的了的。

贴一段测试程序:

#include <stdlib.h>
#include <stdio.h>
#include <string>
#include<iostream> using namespace std; int main(int argc, char* argv[])
{
string n;
double dd = 3.12;
double *ptr3;
double *ptr = &dd;
ptr3 = ptr;
double ptr2=;
//const double d = 32;
////ptr = d;
ptr = &ptr2;
std::cout<<ptr<<endl;
std::cout<<*ptr<<endl;
std::cout<<*ptr3<<endl;
std::cin>>n;
}

ok,现在推广一下,推广到函数

double *abc(double *d,double e){
 *d=3.33333;
 e = 3.1415926;
 return d;
}

这是函数的返回值类型是(int *),也就是说,函数的返回值是个地址,c++的(空格+*)总是很迷惑人。再看看参数,参数d是地址,e是变量实体,所以传参的时候要传对,当概念*d的实体值时,实参的值也改变啦。

继续看

彻底澄清c/c++指针概念的更多相关文章

  1. C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

    指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...

  2. C语言中file文件指针概念及其操作 (转载)

    文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

  3. C语言之对指针概念的初步探究

    指针?什么是指针? 指针(pointer)是一个值为内存地址的变量(或数据对象). 接下来从变量的角度分析: 变量有两个属性,一个是地址,一个是值. 指针与普通变量的不同之处在于:指针变量的值是一个内 ...

  4. STL模板_智能指针概念

    一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...

  5. C语言学习笔记--指针概念

    指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...

  6. 英雄pk理解面向对象中的this指针概念

    class Hero { public int ATN { get; set; } public int DEF { get; set; } public int HP { get; set; } p ...

  7. C语言指针的概念

    在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍.为了正确地访问 ...

  8. 关于C语言指针几个容易混淆的概念

    前言: 大多数学习过C/C++或者正在学习的同学在对指针概念把握时,总是感觉不太明了,小弟我也不例外啊,于是翻开资料复习整理一下,并把自己的学习心得拿出来供大家分享,讨论. 基本概念掠过,主要来探讨一 ...

  9. [C]为什么发明指针?

    指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...

随机推荐

  1. ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析

    最近 在学习Android3.0中推出的 Loader 机制,其中CursorLoader 这个加载器说是可以实时监测数据和更新数据,为了一探究竟,就连带的将 ContentProvider和Curs ...

  2. Types的Type访问模式

    在Types类中定义的访问都类如下: 1.MapVisitor类 2.SimpleVisitor 3.UnaryVisitor 4.TypeRelation

  3. MySQL数据库以及其Python用法

    一 命令行模式下: mysql -u root -p # 进入进入mysql命令行模式 show databases; # 查看所有数据库 create database data; # 创建数据库, ...

  4. Http的Get和Post--扫盲篇

    Http Get请求,根据Http规范Get用于服务器信息的获取,而且安全及幂等的.其中安全的在此处的含义是:不会对服务器数据造成修改.增加.以及数据状态的改变. Http Post请求,表示可能修改 ...

  5. JAVA-1NIO概述

    注意: 转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(一) Java NIO 概述 JAVA-1NIO概述 Java NIO 由以下几个核心部分组成: Channe ...

  6. webstorm中sass编译时目录或内容包含中文字符报错

    ruby版本:ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32] sass版本:Sass 3.4.22 (Selective Steve) ...

  7. [转]C#中Timer使用及解决重入问题

    本文转自:http://www.cnblogs.com/hdkn235/archive/2014/12/27/4187925.html ★前言 打开久违的Live Writer,又已经好久没写博客了, ...

  8. php访问mysql数据库的步骤

    官方说5.5开始就废弃mysql_query()这块东西很多,当然常用的就几个还是看手册吧. 这里简单记录一下.在我失忆之后可以找回一点记忆.最近一直用框架原生的都快忘了. 1.打开mysql连接 $ ...

  9. Vue 多路由文件的合并

    Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...

  10. 【转】 面向对象(OO)程序设计

    前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发 ...