C++ *p &a p->function() 之间的意义
来源:互联网 发布:sqlserver列转行函数 编辑:程序博客网 时间:2024/05/22 13:54
困惑了好久的知识终于抽个时间总结一下
1.C++指针跟取地址之间的问题
指针的概念
本质上讲指针也是一种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,指针就是地址。指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。
指针的内容
指针的内容包含4部分:指针的类型,指针所指向的类型,指针的值,指针本身所占有的内存区。在初学指针时,指针的类型和指针所指向的类型是极容易搞混淆的,弄清楚这些概念,有助于我们正确的使用指针。
指针的类型和指针所指向的类型
从语法上讲,指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分。
指针指向的是一块内存区域,指针所指向的类型取决于这块内存在编译时是什么类型,比如一个int*类型指针所指向的类型是int。
下面我来就一些例子来对这两个概念进行说明。
- int p;//这仅仅是一个普通的变量
- int* p;//int*也表示一种数据类型:int指针类型。所以p的类型为:int*类型,p所指向的类型为int型
到这里,稍微暂停一下。教大家一种如何看待指针类型和指针所指向的类型的方法。(我自己的理解)
就上面这个int*p例子来说,它可以写成int* p,也可以写成int *p。第一种的理解偏向于地址,就是p是一个地址变量,p表示一个十六进制地址;第二种的写法偏向于值,*p是一个整型变量,它能够表示一个整型值。
这两种写法都正确,只是理解上不同,但是我认为,在理解指针类型和指针所指向的类型这两个概念时,完全可以把它们两个结合起来。
想想我们使用指针的步骤:声明指针,为指针赋值,然后使用指针所指向的值。
我们都知道指针是一种复合数据类型,它必须和基本的类型结合才能构成指针类型。
那么int*就是一种复合的数据类型——整型指针类型。
这样就好解释第一种写法了,在声明时,int* p,直接声明p变量为整型指针类型,这是第一步。
第二步就是为指针赋值了,p是指针类型,它存放的是地址,这里假设我这样为它赋值:p = &普通变量;(比如int a = 5;p=&a;)。
第三步使用指针,在C++ Primer中详细的解释了*是解除引用的运算符(我的理解是地址解析运算符),如果p是地址,那么*p就是实际的值(比如上面对应的*p = 5)。对于初学者来说,在理解它的含义时,完全可以跨过这一步,上面说了在声明指针时int* p和int *p这两种写法都可以,在声明时我偏向第一种理解,在使用时我偏向第二种理解:毕竟我们使用的是值,而*p就是这个值。
我的结论:对于int* p和int *p的理解(也是对于指针类型和指针所指向的类型的理解),一个指针包含两部分,地址和值,指针声明时声明的是一个地址变量(指针就是地址),在使用时使用的是指针所指向的值。或者说指针包含两个类型:指针类型和指针所指向的类型,声明时是声明指针类型,使用时是使用指针所指向的类型。
<span style="font-size:18px;"> int* pt = &higgens;//是对pt进行赋值,而不是*pt。等价于int* pt; pt = &higgens; int updates = 6; int *p_updates; p_updates = &updates;</span>
2.->跟.之间的问题
如果p是指针,p->function();
如果p是左边必须是对象或者结构体,一般是类对象,p.function();
如果定义如下:
A *p则:p->play()使用; 左边是结构指针。
A p 则:p.paly()使用; 左边是结构变量。
总结:
箭头(->):左边必须为指针;
点号(.):左边必须为实体。
先写到这里。。。未完待续。。。
- C++ *p &a p->function() 之间的意义
- 指针p,*p,&p之间的区别
- 指针p,*p,&p之间的区别
- 论++*p,*p++,*++p之间的区别
- 如何解析被压缩过的Js文件?eval(function(p,a,c,k,e,d){.....,{}))
- 解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码
- 轻松解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码
- eval(function(p,a,c,k,e,d)系列javascript脚本的解密程序
- 关于eval(function(p,a,c,k,e,d)以及unicode的解码练习
- C语言指针的*p++ ,*p(++), (*p)++,*++p的使用
- C语言指针的*p++ ,*p(++), (*p)++,*++p的使用
- Number(p,s)的意义 !
- 【C语言】*++p,*p++,++*p,++*++p,++*p++
- JS eval(function(p,a,c,k,e,r){e=function(c)*****解密
- C语言基础指针之const char *p,char const *p,,cahr * const p 三者之间的区别
- C:A^X mod P
- 【C语言】对指针p ,*p ,**p 的认知
- C语言*p、p以及&p的区别
- Python陷阱:tuple与Nonetype
- Linux中修改环境变量及生效方法
- CSAPP 学习笔记 Chapter two
- C++成员函数的一些理解
- [DevExpress]控件-checkboxlist之运用
- C++ *p &a p->function() 之间的意义
- 【笔记】Double类型的加减乘除(项目中在计算价格中用到)
- Android获取手机/SD卡内存空间使用情况
- Win10 配置 Anaconda+theano
- ssh 免密码登陆失败的权限问题
- 封装 、 继承 、多态
- compress()方法
- 【Java基础】--构造函数
- gdb使用介绍