【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->frontnext之間使用 - >;

感覺自己把自己講懂了[doge]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java clone方法_Java Calendar clone()方法與示例

java clone方法日歷類clone()方法 (Calendar Class clone() method) clone() method is available in java.util package. clone()方法在java.util包中可用。 clone() method is used to return the cloned object of this Calendar object. clone()方法用于返回此Calendar對象…

三、Numpy數組操作

一、對圖片各個像素點的像素值進行操作 image.shape[0]:image圖像的height image.shape[1]:image圖像的width image.shape[2]:image圖像的channels import cv2 import numpy as npdef access_pixels(image):print(image.shape)height imag…

picacg服務器維護,picacg的服務器地址是什么

彈性云服務器 ECS彈性云服務器(Elastic Cloud Server)是一種可隨時自助獲取、可彈性伸縮的云服務器,幫助用戶打造可靠、安全、靈活、高效的應用環境,確保服務持久穩定運行,提升運維效率三年低至5折,多種配置可選了解詳情用戶數據注…

Redis-Sampler:深入了解你的Redis存儲

redis-sampler 是Redis作者antirez 同學開發的一個ruby 小工具,用于對Redis存儲概況進行抽樣檢測并給出分析結果。 項目地址:https://github.com/antirez/redis-sampler 使用方式: 下載源碼,執行下面命令: ./redis-sam…

二叉樹筆記(深度遍歷與廣度遍歷+13道leetcode題目(深度3道、廣度10道))

本文章為結合leetcode題目以及公眾號“代碼隨想錄”的文章所做的筆記! 感覺代碼隨想錄的題目整理真的很好,比自己盲目刷題好很多。 目錄1、二叉樹小記1、滿二叉樹與完全二叉樹2、二叉搜索樹3、平衡二叉搜索樹AVL4、二叉樹存儲方式5、二叉樹遍歷方式6、二…

ZZ的計算器

Problem Description ZZ自從上大學以來,腦容量就是以SB計算的,這個吃貨竟然連算術運算也不會了,可是當今的計算機可是非常強大的,作為ACMer, 幾個簡單的算術又算得了什么呢?可是該怎么做呢?ZZ只…

kotlin 覆蓋屬性_Kotlin程序| 方法覆蓋的示例

kotlin 覆蓋屬性方法重載 (Method Overriding) Method overriding allows derived class has the same function name and signature as the base class 方法重寫允許派生類具有與基類相同的函數名稱和簽名 By method overriding we can provide different implementation into…

對視頻中的特征顏色物體(青色水杯)進行跟蹤

方法一:目標物體白色,其余黑色 import cv2 import numpy as npdef extrace_object():capture cv2.VideoCapture("G:/Juptyer_workspace/study/data/yy.mp4")while(True):ret,frame capture.read()if retFalse:breakhsv cv2.cvtColor(frame…

Android實現號碼歸屬地查詢

我們通過發送XML訪問 WebService就可以實現號碼的歸屬地查詢,我們可以使用代理服務器提供的XML的格式進行設置,然后請求提交給服務器,服務器根據請求就會返回給一個XML,XML中就封裝了我們想要獲取的數據。 發送XML 1.通過URL封裝路…

如何從 Datagrid 中獲得單元格的內容與 使用值轉換器進行綁定數據的轉換IValueConverter...

一、如何從 Datagrid 中獲得單元格的內容 DataGrid 屬于一種 ItemsControl, 因此,它有 Items 屬性并且用ItemContainer 封裝它的 items. 但是,WPF中的DataGrid 不同于Windows Forms中的 DataGridView。 在DataGrid的Items集合中,DataGridRow…

【C++ grammar】常量、指針、Usage of using, typedef, and #define

目錄1、常量 (Constant)2、指針(Pointer)3、Usage of using, typedef, and #define1、常量 (Constant) 常量是程序中一塊數據,這個數據一旦聲明后就不能被修改了。 如果這塊數據有一個名字&am…

斯威夫特山地車_斯威夫特| 兩個數字相加的程序

斯威夫特山地車In this program, we will have an idea - how two numbers can be added and displayed as the output on the screen? 在此程序中,我們將有一個想法- 如何將兩個數字相加并顯示為屏幕上的輸出 ? Open XCode terminal and type the fol…

四、色彩空間

一、色彩空間 1、什么是色彩空間? 色彩空間是定義的顏色范圍。 2、常見的色彩空間有哪些? ①RGB ②HSV 在OpenCV中,Hue的值為0~180,之所以不是360是因為,8位存不下,故進行歸一化操作,使得H…

Oracle LOB 詳解

一. 官方說明Oracle 11gR2 文檔:LOB Storagehttp://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294/adlob_tables.htm#ADLOB45267Oracle 10gR2 文檔:LOBs in Tableshttp://download.oracle.com/docs/cd/B19306_01/appdev.102/b14249/adlob_t…

FIFA的完整形式是什么?

國際足聯:國際足球聯合會 (FIFA: Federation Internationale de Football Association) FIFA is an abbreviation of the "Federation Internationale de Football Association" in French. It is also known as the International Federation of Associa…

POJ 1654 Area

題意:從原點出發,沿著8個方向走,每次走1個點格或者根號2個點格的距離,最終回到原點,求圍住的多邊形面積。分析:直接記錄所經過的點,然后計算多邊形面積。注意,不用先保存所有的點&am…

【C++ grammar】重載、內聯、變量作用域、帶默認參數的函數

目錄1、變量的作用域1. 變量的作用域分類2. Unary Scope Resolution (一元作用域解析運算符)2、重載函數3、帶有默認參數值的函數4、重載函數 VS 帶有默認參數值的函數5、內聯函數(Inline Function)1. 普通函數的優缺點2. 使用內聯函數3. 定義內聯函數4.…

五、像素運算

一、相關概念 1、算術運算 Ⅰ加減乘除 Ⅱ調節亮度 Ⅲ調整對比度 2、邏輯運算 Ⅰ與或非 Ⅱ遮罩層控制 二、圖像算術運算(加減乘除均值方差) 其中圖像的加減乘除需要保證兩張圖像的大小相同 import cv2 import numpy as npdef add(src1,src2):dst cv2.add(src1,src2)cv2.im…

創建bootstrap項目_使用Bootstrap創建第一個網頁

創建bootstrap項目使用Bootstrap創建第一個網頁 (Create First Webpage with Bootstrap) In the previous article, we learned "how to setup bootstrap?" for a web project. If you haven’t gone through that, it is recommended to read it. Now, in this art…

Chaikin Curve(球面插值)

在兩條折線間完成平滑的過渡是 用畫布做UI 或者做類似地圖編輯器一類的工作的 很常見的任務。 怎么樣化方為圓是決定工作效率的很重要的因素。(當需要編輯的曲線多起來, 復雜起來的時候,這會是件相當繁重的工作) 最容易想到的莫非…