2
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;

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

4

3 回答 3

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.

于 2013-06-30T10:01:45.540 回答
3

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

Object* pObject1, pObject2, pObject3;

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

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

Object* pObject1, *pObject2, *pObject3;

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

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

于 2013-06-30T10:09:18.433 回答
1

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

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

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

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

NULL(address 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) );
于 2013-06-30T10:49:27.623 回答