【C、C++基础】什么时候用 “.” 什么时候用“->”(3个实例搞懂)
从堆栈的角度来说:
从堆栈的角度来说:
对象放在堆上,就要用指针,也就是对象指针->函数;
放在栈上,就对象.函数
那么如何判断对象放在堆上还是栈上?
从我的另一篇笔记【C++ grammar】C++简化内存模型可知:
stack(栈)编译器自动分配内存(函数内部定义得局部变量、形参)
堆(Heap)一般由程序员分配释放
int *p ; char *p;
应该是在栈区分配
如果是这样
p=(int *)malloc(sizeof(int))
在C++中则是使用了new
是在堆区
用个具体的例子说明:
假设有一个类: ClassA
1、如果声明的是一个对象: ClassA A
则用 A.function
2、如果声明的是一个对象指针:ClassA* A=new A;
则用 A->function
注意一点:
C++中如果声明一个对象指针时没有分配内存,那么不会调用构造函数
一个指针在内存中也是有内存空间的。
在现在大多数机器上指针都是32位的,也就是4个字节。
如果你声明指针。例如,假设A是一个类
A *pa;
这内存中会分配4个字节的空间存储一个地址。只不过地址是不可以用的,因为它没有有效的指向某一个有用的内存空间。这和你声明一个int类型是一样的。
int p;
内存中也会分配4个字节空间给p来存储一个整形值,只不过这个整形值不是可用的,或者是垃圾的。
但是对应你说的调用构造函数。其实指的是
A *pa=new A;
这个时候,就会调用A的默认构造函数。它会在内存中分配内存,别且把这个有效的内存地址存储到指针变量pa的4个字节空间中。
从指针和对象的角度来说:
从指针和对象的角度来说:
具体实例1:
p是指针,指向Coordinate类型数组中的第一个元素的地址,即首地址
p[0]表示是数组中第一个元素,是以Coordinate类型对象。
对象访问自己的数据成员或者成员函数,必须用 . ;
p指针指向的元素是p[0],属于使用指针访问数据成员和成员函数,应该用->
总结:
如果是指针访问数据成员或成员函数,用->;
如果是某个数据类型的对象,访问自己的数据成员和成员函数用 . ;
进阶实例2:leetcode 206
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode* reverseList(ListNode* head) {if(head ==NULL || head->next == NULL){return head;}ListNode* cur = reverseList(head->next);head->next->next = head;head->next = NULL;return cur;}
};
head->next->next = head;
head的类型是指针,所以引用的时候用->;
head->next的类型也是指针,所以引用的时候也用的->;
进进阶实例3:实现一个链队列
再来最后一个例子,实现一个链队列
具体可以先看一下我的另一篇笔记:
【数据结构基础笔记】【队列】
typedef char ElemType ;
//队列元素类,队列中的每个元素都是QNode类
typedef struct QNode{ElemType data; //队列结点的数据域struct QNode* next; //队列结点的指针域
}QNode, *QueuePtr;typedef struct {QueuePtr front; //队头指针,用来存放队头元素的地址QueuePtr rear; //队尾指针,用来存放队尾元素的地址
}LinkQueue;
//这里定义得队列是一个链队列,队列之间的元素由指针相连,所以只要掌握了队列的队头指针和队尾指针,就可以对队列进行各种
再看下面代码,注意q对成员的引用方式
//创建一个空队列
void InitQueue(LinkQueue* q)
{q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); //初始化一个队列指针大小的空间,并将地址传给头指针和尾指针if (!q->front){printf("内存分配失败");exit(0);}q->front->next = NULL; //头结点指针域指向空
}
q是指向LinkQueue类型数据的指针;
LinkQueue类型数据有两个成员front、rear,都是QueuePtr 类型的数据。
QueuePtr是指向QNode类型数据的指针。
q->front,属于指针访问LinkQueue类型数据的成员,所以使用->
q->front->next,q->front属于QueuePtr 类型,是指向QNode数据类型的指针,且next是QNode类型的数据对象。
所以q->front与next之间使用 - >;
感觉自己把自己讲懂了[doge]
【C、C++基础】什么时候用 “.” 什么时候用“->”(3个实例搞懂)相关推荐
- 干货丨先搞懂这八大基础概念,再谈机器学习入门
翻译 | AI科技大本营 参与 | 林椿眄 准备好开始AI了吗?可能你已经开始了在机器学习领域的实践学习,但是依然想要扩展你的知识并进一步了解那些你听过却没有时间了解的话题. 这些机器学习的专业术语能 ...
- java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...
- 【机器学习基础】一文搞懂机器学习里的L1与L2正则化
文章来源于SAMshare,作者flora 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化 今天我们来讲讲一个理论知识,也是老生常谈的内容,在模型开发相关岗位中出场率较高的,那就是L1与L2正则化 ...
- 商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
0基础搞懂自动驾驶传统算法与深度学习的鸿沟这个专题核心是要思考如何让rule-base的自动驾驶算法逐步提升为data-driven的算法,从而尽可能的提升软件的泛化性.数据驱动的逻辑代替控制,规划, ...
- JAVA每个初学者都应该搞懂的问题 还可以比较基础
还可以比较基础 转自http://blog.csdn.net/devillyd/article/details/2486520 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Ja ...
- mlp参数调整_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
0基础搞懂自动驾驶传统算法与深度学习的鸿沟这个专题核心是要思考如何让rule-base的自动驾驶算法逐步提升为data-driven的算法,从而尽可能的提升软件的泛化性.数据驱动的逻辑代替控制,规划, ...
- java跳转控制语句有哪些_Java语言基础学习之流程控制语句和跳转控制语句实例分析...
本文主要向大家介绍了Java语言基础学习之流程控制语句和跳转控制语句实例分析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 一.流程控制语句 在一个程序执行的过程中,各条语句的执行顺 ...
- 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...
- 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下
B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...
最新文章
- unity中摄像机的控制---调整摄像机,不让他摔倒
- Caffe将自己的文件生成lmdb
- [整理]Windows Mobile(.NET CF)开发的书籍
- jQuery前端教程-张晨光-专题视频课程
- 使用NGINX作为HTTPS正向代理服务器
- Lazy Evaluation(延迟执行)
- Struts2的ValueStack(值栈)介绍
- Python列表与数字的四则运算
- oracle 00350,Oracle错误编码大全
- 家里的穿墙的网线不好用了,想换一根,换不了,不走明线有什么好办法?
- oracle 返回list,myabatis oracle 调用存储过程返回list结果集
- Killer Problem
- EBS AP 创建会计科目失败
- 又一灵异事件 Delphi 2007 在 Win7
- [python3]坦克大战
- tesseract 学习笔记 psm+限定识别内容提升识别精度
- 深圳哪个区最富,哪个区最穷?最新GDP排名出炉,没想到第二名是
- 关于房价问题的看法。
- Vue+SpringBoot的篮球社区平台
- linux meld
热门文章
- 解决 invalid input detected at ‘^’ marker的问题
- HFS远程命令执行漏洞复现
- dataframe建一个空的,创建一个空的Pandas DataFrame,然后填充它?
- js return的值取不到_【JS基础】隐式转换(一)
- Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)
- 【译】10个有趣的JSCSS库(2018.10)
- html5 图片上传 预览
- 设计模式学习笔记-代理模式
- MySQL中查询获取每个班级成绩前三名的学生信息
- MySQL----示例知识点整理