来自CSDN的问题


举个例子
=======================
Name *name1=new Name[4];
Name *name2=new Name();
假设Name类有一方法void show();
======================
我一直以为由于都是由new 构成的,所以,第一个name 和第二个name都是指针。今天刚好用第一个类对象的方法:name1[0]->show(); 编译器就报错,当我换成name1[0].show();时候,就能正确运行了
想请问下大家,既然动态内存是由new分配的,那name1应该也是指针啊,因为name1前有个*(即*name1),并且又是又new分配空间的。但是它调用方法时候却又只是表现出只是个Name[]的数组元素。
有朋友能告诉下我到底什么样的new 才算真正的动态内存分配,才算指针吗???
谢谢!!!

以下为解答内容,各段为一个解答。

name1是数组指针,name1[0]就是数组中的值了.

你可以直接用name1->来调用.
name1就是指针,它和name2并没有什么不同,同样你也可以用name2[0].来调用函数.

Name[0]指的是数组中的第一个元素,不是个指针~~~~~~~
在定义Name *name1=new Name[4]时name1确实是个指针,他指向了数组Name[] 而用name1->show()应该是正确的,这样的话就相当于将函数show的首地址给了name1, Name *name2=new Name();表示开辟了一个函数Name的内存地址,name2表示了这个函数的首地址

我一直以为由于都是由new 构成的,所以,第一个name 和第二个name都是指针。
--------------------
正是如此!
都是指针,但是,name1[0]就是值了 ... 同样,name2[0]也是一个值,楼主自己试试就知道了 ..

Name *name2=new Name();
//首先构造Name()默认构造函数对象然后new出对象拷贝构造出来
Name *name2=new Name[3];
//是先分配空间然后构造对象

Name1[0]是个对象(如果你拷贝了其他对象给他,当然你是要拷给他才能用)
Name1,Name2都是指针


int* p1 = new int[4];
int* p2 = new int;
一样

指针是这样用滴~~~
for(int i = 0;i < 4; i++) {
(name1+i)->show();
}

name2 是构造单个对象指针
name1是构造四个对象的指针。具体到每一个对象就不是指针,而是数组

//#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;

}

是指针,但是是数组的指针
比如这样
name *p = new name[4];
p->show()相当于p[0].show();
通俗的说,你在定义的时候的那个name*中的*号指的是对象数组,并不是对象指针

name1[0]->show();里的name1[0]改成name1就OK了。楼主可以补一补数组的有关知识。

========================================================
copy了这篇文章,其实我只想说下我的看法。
Name *p=new Name[4];
p->show();      //正确
p[0].show();    //正确
第一个可以这样理解:指针P指向数组首地址,其实就是P指向Name[4]数组中第一个元素的地址,所以,如果使用p->show(),则意思其实就是让数组中第一个元素,即第一个对象name调用自身show(),再说白点,就是name.show();
第2个可以这样理解:p[0]可以理解成P指向数组中第[0]个元素,所以就有了p[0],所以更会有了p[0].show();