C++ 关于指针的澄清
C++ 关于指针的澄清,c++,pointers,C++,Pointers,object和poobject是否分配了相同数量的内存 Object* pObject; Object object; pObject = &object; 及 这两者的区别是什么? 在第二个示例中取消引用pObject2和pObject3是否安全?在第一个代码段中,内存中只有一个对象。 对象属于“对象”类型对象的类型为“对象的地址” 翻译: pObject1 = &object; pObject2 = pObject1; pObject3 = pObject1; 在第二个代
object
和poobject
是否分配了相同数量的内存
Object* pObject;
Object object;
pObject = &object;
及
这两者的区别是什么?
在第二个示例中取消引用
pObject2
和pObject3
是否安全?在第一个代码段中,内存中只有一个对象。
对象
属于“对象”类型<代码>对象的类型为“对象的地址”
翻译:
pObject1 = &object;
pObject2 = pObject1;
pObject3 = pObject1;
在第二个代码中,将有三个类型为“address of something of typeObject
”的变量,它们都包含Object
的地址。指针就像“表示内存地址的数字”。然而,正如Gorpik Meniton所说,您应该将它们声明为
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
这就是为什么它要把星号放在名称附近的原因之一——在本例中是pObject
——而不是类型——在本例中是Object
。像“类型Object
:指针pObject1
指向什么,指针pObject2
指向什么,等等”一样阅读
第三个代码段具有相同的效果。这三个变量都会得到
对象的地址
首先,您有一个声明错误。以下一行:
Object *pObject1, *pObject2, *pObject3;
不声明三个指针;它声明一个指针(pObject1
)和两个对象(pObject2
和pObject3
),指针未初始化,对象默认初始化
假设我们修复了此错误,例如:
Object* pObject1, pObject2, pObject3;
在第一部分中,您的问题的严格答案是否定的。指针和对象通常不会被分配相同的内存量。但我猜你的意思是,如果对象与指针指向的对象占用相同的内存。在这种情况下,pObject
正好指向对象所占用的内存区域,因此答案是肯定的。但是pObject
通常会自己占用一些内存,因此它需要更多的内存(指针本身和指向的对象的内存)
在第二种情况下,两段代码是等效的pObject1
,pObject2
和pObject3
最终具有相同的值,即对象的内存地址。取消引用pObject2
和pObject3
是完全安全的。指针是一个变量,用于存储内存地址
指针中存储的地址是它指向的对象的内存结构的第一个块的地址
指向类型
的对象的指针语法:
Object* pObject1, *pObject2, *pObject3;
NULL
(地址0
)表示当前不指向任何位置的指针:
TYPE * pointer; // define a pointer of type TYPE
要获取变量或对象的内存地址,请执行以下操作:
pointer = 0;
要获取指向的类型
变量,请取消引用指针:
pointer = &object; // pointer now stores the address of object
例如:
assert(&(*pointer) == &object); // *pointer ~ object
void*
是一种特殊的指针类型,可以存储任何程度的指针,但在将其转换为兼容类型之前不能使用
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 ?
不管指针指向什么(指向成员的指针是不同的故事),指针都有固定的大小(通常),因为它们持有内存地址。所以第一个问题的答案是否定的。第二段代码是不合法的-pObject2
和pObject3
不是指针。@jrok啊,语法错误
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 * z = &c; // c holds int**
printf(" %d \n ", **((int**)c) );