Object* pObject;
Object object;
pObject = &object;
object
和pObject
获得的内存量是否相同?
Object* pObject1, pObject2, pObject3;
Object object;
pObject1 = &object;
pObject2 = &object;
pObject3 = &object;
和
pObject1 = &object;
pObject2 = pObject1;
pObject3 = pObject1;
两者有什么区别?
在第二个示例中取消引用pObject2
和pObject3
是否安全?
答案 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
)和两个对象(pObject2
和pObject3
),指针未初始化,对象默认初始化。
我们假设我们修复了这个错误,例如:
Object* pObject1, *pObject2, *pObject3;
在第一部分中,对你的问题的严格回答是否定的。指针和对象通常不会被分配相同数量的内存。但我想你的意思是,如果对象占用的内存与指针指向的内存相同。在这种情况下,pObject
指向object
占用的内存区域,所以答案是肯定的。但是pObject
通常会占用一些内存,所以它需要更多的内存(对于指针本身和指向对象的内存)。
在第二种情况下,两段代码都是等价的。 pObject1
,pObject2
和pObject3
最终具有相同的值,即object
的内存地址。取消引用pObject2
和pObject3
非常安全。
答案 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) );