Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于指针的澄清_C++_Pointers - Fatal编程技术网

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 type
Object
”的变量,它们都包含
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) );