從堆棧的角度來說:
從堆棧的角度來說:
對象放在堆上,就要用指針,也就是對象指針->函數;
放在棧上,就對象.函數
那么如何判斷對象放在堆上還是棧上?
從我的另一篇筆記【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]