關於C++裡面指針開闢數組的一個類型聲明的問題?
想問一個指向求組的指針的類型問題,就是最前面的指針類型和後面開闢數組的類型聲明,有什麼區別?可以不一致嗎?我覺得按照指針的定義,這兩個類型必須一致。可是這樣的話,又有什麼意義在兩處聲明呢?
形如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的人問這樣的問題……
其實父類指針可以指向子類對象的
推薦閱讀: