想問一個指向求組的指針的類型問題,就是最前面的指針類型和後面開闢數組的類型聲明,有什麼區別?可以不一致嗎?我覺得按照指針的定義,這兩個類型必須一致。可是這樣的話,又有什麼意義在兩處聲明呢?

形如float *p=new int[],這樣的聲明有意義嗎?

對指針這部分比較蒙,如果問的問題太弱智,還望大佬見諒。


瀉藥

一、兩處類型聲明可以不一致嗎?

首先new T和new T[n]都會返回一個T *指針,那麼問題可以簡化為返回的T *指針能不能隱式轉換為前面聲明的指針。

1.任何類型的指針都可以隱式轉換為void *

void *p1 = new int[3];

2.派生類對象指針可以隱式轉換為基類對象指針

CBase *p2 = new CDerived;

二、為什麼大部分情況下兩處類型相同還要求寫兩次類型?

面向對象設計的時候一般指針基類類型的,但是實際上卻指向的派生類的對象,然後通過虛函數實現多態。這部分情況下兩處的類型就不相同了。為的是支持如下用法:

CBase *p3 = new CDerivedA;
CBase *p4 = new CDerivedB;

PS:如果你實在不喜歡的話,可以這樣做:

auto p = new int[3]; // p是int *類型


現在一處聲明是可以的。

auto *p=new int[10];

以前兩處聲明是編譯器不會類型推導。

float *p=new int[]

如果這樣寫,編譯器會報錯, 指向浮點數內存地址的p 你卻指向了存儲整數的內存地址。


補充幾點

1.數組聲明一定要指定大小

2.如果非要這樣可以強制類型轉換

比如float* p=(float*)new p[10];

3.數組實際上就是一種語法糖,本質上就是指針,只要對指針成立,對數組就成立

4.p[i]實際上是等價於*(p+i)

附上證據,雖然沒啥用,但是蠻好玩蠻好不是麼

#include&
#include&
using namespace std;
int main(){
int p[10];

0[p]=100;

cout&


其他回答已經比較明晰了,補充一點 new表達式 的內部原理。

string * sp = new string();
//上述表達式由三個步驟構成:
//1、調用 operator new 標準庫函數或者類特定的 operator new 函數分配內存, 返回類型為 void *。。
//2、在分配的內存上調用相應的構造函數。
//3、返回指針地址。

再推薦一篇帖子補充關於指針和數組的相同和區別之處:

The difference between pointers and arra?

www.cplusplus.com


瀉藥。。。。

?????怎麼會邀請我呢。。。


怎麼沒有用Java的人問這樣的問題……

其實父類指針可以指向子類對象的


推薦閱讀:
相關文章