2013-06-30 99 views
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; 

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

+2

指针有一个固定大小(usualy) (指向成员的是不同的故事),因为他们拥有一个内存地址。所以第一个问题的答案是否定的。第二块代码不合法​​ - “pObject2”和“pObject3”不是指针。 – jrok

+0

全部都是一样的 –

+0

@jrok啊,语法错误 – mr5

回答

5

在第一个代码片段中,内存中只有一个对象。 object是“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 menitoned,应声明它们作为

Object *pObject1, *pObject2, *pObject3; 

这是一个原因,它interetsing保持密切的名称星号 - 在这种情况下pObject - 而不是类型 - 在这种情况下, Object。如“Object:指针pObject1指向什么指针pObject2指向”等。

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

+0

+1给出了将'*'放在var名字附近的原因。 – mr5

3

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

Object* pObject1, pObject2, pObject3; 

不声明三个指针;它声明一个指针(pObject1)和两个对象(pObject2pObject3),该指针被初始化并且对象被默认初始化。

假设我们修复这个bug,如:

Object* pObject1, *pObject2, *pObject3; 

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

在第二种情况下,两段代码是等效的。 pObject1pObject2pObject3结束具有相同的值,这是object的存储器地址。解引用pObject2pObject3是完全安全的。

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