关于指针的澄清

时间:2013-06-30 09:50:55

标签: c++ pointers

Object* pObject;
Object object;
pObject = &object;

objectpObject获得的内存量是否相同?

Object* pObject1, pObject2, pObject3;
Object object;
pObject1 = &object;
pObject2 = &object;
pObject3 = &object;

pObject1 = &object;
pObject2 = pObject1;
pObject3 = pObject1;

两者有什么区别? 在第二个示例中取消引用pObject2pObject3是否安全?

3 个答案:

答案 0 :(得分:5)

在第一个代码段中,内存中只有一个对象。 object的类型为“对象”。 pobject的类型为“Object的地址”。

翻译:

Object* pObject;    // Objectp is a POINTER that may be used for objects of type Object
Object object;      // Allocate on the stack an "Object". Call it "object"
pObject = &object;  // pObject points (that is, stores the ADDRESS of) object

在你的第二个代码中,会有三个变量类型为“Object 类型的地址”,所有这些变量都保存Object的地址。指针就像“代表内存地址的数字”。但是,正如Gorpik所说,你应该将它们声明为

Object *pObject1, *pObject2, *pObject3;

这是保持星号接近名称的一个原因 - 在这种情况下是pObject - 而不是类型 - 在这种情况下是Object。阅读它类似于“类型Object:指针pObject1指向什么,指针pObject2指向什么”等。“

第三个代码段具有相同的效果。所有三个变量都得到object的地址。

答案 1 :(得分:3)

首先,你有一个声明错误。以下一行:

Object* pObject1, pObject2, pObject3;

没有声明三个指针;它声明了一个指针(pObject1)和两个对象(pObject2pObject3),指针未初始化,对象默认初始化。

我们假设我们修复了这个错误,例如:

Object* pObject1, *pObject2, *pObject3;

在第一部分中,对你的问题的严格回答是否定的。指针和对象通常不会被分配相同数量的内存。但我想你的意思是,如果对象占用的内存与指针指向的内存相同。在这种情况下,pObject指向object占用的内存区域,所以答案是肯定的。但是pObject通常会占用一些内存,所以它需要更多的内存(对于指针本身和指向对象的内存)。

在第二种情况下,两段代码都是等价的。 pObject1pObject2pObject3最终具有相同的值,即object的内存地址。取消引用pObject2pObject3非常安全。

答案 2 :(得分:1)

指针是一个存储内存地址的变量

指针中存储的地址是它指向的对象的内存结构的第一个块的地址

指向类型为TYPE的对象的指针的语法:

TYPE * pointer; // define a pointer of type TYPE

NULL(地址0)表示一个指向当前不在任何位置的指针:

pointer = 0;

获取变量或对象的内存地址:

pointer = &object; // pointer now stores the address of object

要获取指向的TYPE变量,请取消引用指针:

assert(&(*pointer) == &object); // *pointer ~ object

例如:

int a = 10; // type int
int * b = &a; // pointer to int
int* * c = &b; // pointer to int*

printf(" %d \n ", a );
printf(" %d \n ", *b );
printf(" %d \n ", **c );

char t [256] = "Not Possible ?";

char * x = t;
char * y = (x + 4); // address arithmetic

printf(" %s \n ", x ); // Not Possible ?
printf(" %s \n ", y ); // Possible ?

void*是一种特殊的指针类型,可以存储任何程度的任何指针,但在将其转换为兼容类型之前不能使用..

void * z = &c; // c holds int**

printf(" %d \n ", **((int**)c) );