有关空指针与其他类型指针转换的有关问题
有关空指针与其他类型指针转换的问题
大家都知道空指针在默认情况下是不能转换为其他类型的指针的,小弟现在有一个疑惑是:new操作符的返回类型是void *型的,为什么它可以直接赋值给对应类型的指针呢?例如:
class point
{
......
};
point *ptr=new point;
为什么new就可以直接从void*转换为point *而不出错呢?
------解决方案--------------------
返回的是piont*类型不是void*
malloc才是返回void*
------解决方案--------------------
你对new的理解有些错误,new point不仅仅负责申请一块内存,还负责在这块raw memory上进行必要的构建工作,比如你的point中定义了一个默认构造函数,new在调用operator new申请完内存之后,要在上面调用构造函数构造出一个point对象,然后将这个对象的地址返还给你。new point != operator new,后者只是前者工作的一部分。
------解决方案--------------------
所有new operator的定义都必须是这样的
void* operator new(std::size_t _Count ,其他参数)
它返回的确实是void *类型的指针.
正如上面rattlesnake620 所说,在用new操作符在堆上创建对象时,我们不仅仅只是为其分配了内存空间,同时还调用了所要创建对象的构造函数.并将分配的内存空间的地址赋给对象的this指针.
这样 new Point(),所返回的就不是一个void*的指针了.而是一个Point对象的指针.
------解决方案--------------------
空指针是void *型指针吗?
int *p = NULL (定义在<stdlib.h>中)
我们说指针p没有指向任何类型对象.这样做的目的:安全.
void *q;
表示q是void *型指针可以指向任何类型对象.(<C++ primer>)可以转换为任意对象类型的指针。
你说的没有错
new 是重载的操作运算符.返回类型是void *型指针
所以:
class point
{
......
};
point *ptr=new point;
void *型指针隐式转换为point *类型指针
------解决方案--------------------
Windows 下任何指针都是一个 32 位地址,也就是 4 个字节。所以不管什么类型的指针都可以强制转换的。指针类型的意义在于告诉编译器要同时处理该地址以及以后的几个字节。
例如一个指针 p 的值是 0x0041FF10 (瞎编的)
如果它是 int * 类型的
那么用 *p 的时候,就会把 0x0041FF10 开始的 sizeof(int) 个字节一起读出来,按 int 类型的存储方法解析出它的值
如果它是 double * 类型的
那么用 *p 的时候,就会把 0x0041FF10 开始的 sizeof(double) 个字节一起读出来,按 double 类型的存储方法解析出它的值
大家都知道空指针在默认情况下是不能转换为其他类型的指针的,小弟现在有一个疑惑是:new操作符的返回类型是void *型的,为什么它可以直接赋值给对应类型的指针呢?例如:
class point
{
......
};
point *ptr=new point;
为什么new就可以直接从void*转换为point *而不出错呢?
------解决方案--------------------
返回的是piont*类型不是void*
malloc才是返回void*
------解决方案--------------------
你对new的理解有些错误,new point不仅仅负责申请一块内存,还负责在这块raw memory上进行必要的构建工作,比如你的point中定义了一个默认构造函数,new在调用operator new申请完内存之后,要在上面调用构造函数构造出一个point对象,然后将这个对象的地址返还给你。new point != operator new,后者只是前者工作的一部分。
------解决方案--------------------
所有new operator的定义都必须是这样的
void* operator new(std::size_t _Count ,其他参数)
它返回的确实是void *类型的指针.
正如上面rattlesnake620 所说,在用new操作符在堆上创建对象时,我们不仅仅只是为其分配了内存空间,同时还调用了所要创建对象的构造函数.并将分配的内存空间的地址赋给对象的this指针.
这样 new Point(),所返回的就不是一个void*的指针了.而是一个Point对象的指针.
------解决方案--------------------
空指针是void *型指针吗?
int *p = NULL (定义在<stdlib.h>中)
我们说指针p没有指向任何类型对象.这样做的目的:安全.
void *q;
表示q是void *型指针可以指向任何类型对象.(<C++ primer>)可以转换为任意对象类型的指针。
你说的没有错
new 是重载的操作运算符.返回类型是void *型指针
所以:
class point
{
......
};
point *ptr=new point;
void *型指针隐式转换为point *类型指针
------解决方案--------------------
Windows 下任何指针都是一个 32 位地址,也就是 4 个字节。所以不管什么类型的指针都可以强制转换的。指针类型的意义在于告诉编译器要同时处理该地址以及以后的几个字节。
例如一个指针 p 的值是 0x0041FF10 (瞎编的)
如果它是 int * 类型的
那么用 *p 的时候,就会把 0x0041FF10 开始的 sizeof(int) 个字节一起读出来,按 int 类型的存储方法解析出它的值
如果它是 double * 类型的
那么用 *p 的时候,就会把 0x0041FF10 开始的 sizeof(double) 个字节一起读出来,按 double 类型的存储方法解析出它的值