我最近了解到指针包含两种类型的信息:内存地址和它们指向的类型。 所以我知道如果我有一个指针,那么我可以判断它指向的对象是int还是double或任何其他原始数据类型。
我的问题是,如果我创建一个名为myObj的对象,并且我有一个指向myObj的指针,那么我可以从指针告诉它指向的东西是一个名为myObj的对象吗?或者只是说指针指向非原始数据类型?
答案 0 :(得分:3)
说指针包含两种类型的信息是不正确的。一般而言,指针(与任何变量一样)有两个属性:类型和值。
指针的类型表示它包含的地址。因此,指向int
(又称int *
)的指针包含int
的地址。
指针的值是实际对象的地址。这是指针包含的信息。
使用类型信息和指针的值,可以对指针指向的对象(或变量)执行任何允许的操作。
例如;
int i;
int *p = &i; // p is of type int *, so points at an int.
// This initialisation gives p a value which is the address of i
*p = 42; // p points at i, *p refers to i, so this statement sets i to be 42
上面有一些例外情况。
void
指针(又名void *
)不包含类型信息(void
近似意味着“在此上下文中没有类型”)但确实有值。< / p>
int i;
void *p = (void *)(&i);
*p = 42; // invalid, since p is a void * - it could point at anything
指针可以是未初始化的(例如,在没有给出初始值的情况下定义)。在这种情况下,访问其值会产生未定义的行为。正如访问它指向的内容一样(因为,为了访问指针指向的内容,有必要访问指针本身的值)。
指针可以初始化或赋值为NULL
或(等效于C ++ 11或更高版本)nullptr
。这是一个特殊值,表示指针不包含对象的地址。访问这样一个不存在的对象也会产生不确定的行为。
使用class
/ struct
类型的事情更复杂。例如,指向多态类型的指针可以包含该类型的任何对象的地址,以及从中派生的任何类型。
答案 1 :(得分:1)
指针有类型,但 不是类型,类型必须与返回的obj匹配。
#include<typeinfo>
#include<string>
#include<iostream>
//..
//..
//..
string name = typeid(*myObj).name()
//..
cout<<"Name: "<< name;
//..
这将返回myObj类型。 欲获得更多信息: http://en.cppreference.com/w/cpp/language/typeid
答案 2 :(得分:0)
给定一个名为MyObj
class MyObj
{
private:
//....
//....
public:
//....
//....
};
指针类型为type MyObj
,如果MyObj下有继承类,它将指向MyObj类型或派生类型。
int main()
{
MyObj obj;
MyObj *ptr = &obj; //adress contained in the pointer
return 0;
}