來自CSDN的問題
舉個例子
=======================
Name *name1=new Name[4];
Name *name2=new Name();
假設(shè)Name類有一方法void show();
======================
我一直以為由于都是由new 構(gòu)成的,所以,第一個name 和第二個name都是指針。今天剛好用第一個類對象的方法:name1[0]->show(); 編譯器就報錯,當我換成name1[0].show();時候,就能正確運行了
想請問下大家,既然動態(tài)內(nèi)存是由new分配的,那name1應該也是指針啊,因為name1前有個*(即*name1),并且又是又new分配空間的。但是它調(diào)用方法時候卻又只是表現(xiàn)出只是個Name[]的數(shù)組元素。
有朋友能告訴下我到底什么樣的new 才算真正的動態(tài)內(nèi)存分配,才算指針嗎???
謝謝!??!
以下為解答內(nèi)容,各段為一個解答。
name1是數(shù)組指針,name1[0]就是數(shù)組中的值了.
你可以直接用name1->來調(diào)用.
name1就是指針,它和name2并沒有什么不同,同樣你也可以用name2[0].來調(diào)用函數(shù).
Name[0]指的是數(shù)組中的第一個元素,不是個指針~~~~~~~
在定義Name *name1=new Name[4]時name1確實是個指針,他指向了數(shù)組Name[] 而用name1->show()應該是正確的,這樣的話就相當于將函數(shù)show的首地址給了name1, Name *name2=new Name();表示開辟了一個函數(shù)Name的內(nèi)存地址,name2表示了這個函數(shù)的首地址
我一直以為由于都是由new 構(gòu)成的,所以,第一個name 和第二個name都是指針。
--------------------
正是如此!
都是指針,但是,name1[0]就是值了 ... 同樣,name2[0]也是一個值,樓主自己試試就知道了 ..
Name *name2=new Name();
//首先構(gòu)造Name()默認構(gòu)造函數(shù)對象然后new出對象拷貝構(gòu)造出來
Name *name2=new Name[3];
//是先分配空間然后構(gòu)造對象
Name1[0]是個對象(如果你拷貝了其他對象給他,當然你是要拷給他才能用)
Name1,Name2都是指針
和
int* p1 = new int[4];
int* p2 = new int;
一樣
指針是這樣用滴~~~
for(int i = 0;i < 4; i++) {
(name1+i)->show();
}
name2 是構(gòu)造單個對象指針
name1是構(gòu)造四個對象的指針。具體到每一個對象就不是指針,而是數(shù)組
//#include
class A
{
public:
int a;
int& get(){return a;};
void set(int i){ a=i;};
A()
{
a=1;
};
};
int main()
{
//
A* a1=new A();
A* a2=new A();
A* pA[2]={a1,a2};
int b=pA[0]->get();
//
int pI[2]={1,2};
int sum=pI[1]+pI[2];
//
A* pB=new A[2];
pB[1].set(1);
int x=pB[1].a;
return 0;
}
是指針,但是是數(shù)組的指針
比如這樣
name *p = new name[4];
p->show()相當于p[0].show();
通俗的說,你在定義的時候的那個name*中的*號指的是對象數(shù)組,并不是對象指針
name1[0]->show();里的name1[0]改成name1就OK了。樓主可以補一補數(shù)組的有關(guān)知識。
========================================================
copy了這篇文章,其實我只想說下我的看法。
Name *p=new Name[4];
p->show();????? //正確
p[0].show();??? //正確
第一個可以這樣理解:指針P指向數(shù)組首地址,其實就是P指向Name[4]數(shù)組中第一個元素的地址,所以,如果使用p->show(),則意思其實就是讓數(shù)組中第一個元素,即第一個對象name調(diào)用自身show(),再說白點,就是name.show();
第2個可以這樣理解:p[0]可以理解成P指向數(shù)組中第[0]個元素,所以就有了p[0],所以更會有了p[0].show();