2010-07-16 77 views
0

我使用C++和我有指针 我知道了一些麻烦,如果我们声明一些变量问题关于第二个三分球

int t=7; 
int *p=&t; 

* P给变量t这里也定义的,但在C++中ADRESS ** ?为什么使用它我读它,但我有一些误解,请任何人可以给我例子,如何使用让约需给出的例子

回答

1

首先* p会给你变量t的值而不是t的地址。只有'p'会给你t的地址。

本质上每个地址只是一个整数。如果您正在编译32位体系结构,那么它将是32位长数字,如果您正在编译64位,那么它将是64位长。这意味着你可以使用一个简单的整型变量来存储任何变量的地址,而不管变量是什么类型,但最好使用适当类型的指针来存储变量的地址。这样我们可以对指针进行解引用,并且我们不必在任何时候使用正在指向的变量来进行类型转换。

要创建一个指向某个变量的指针,我们声明一个相同类型的变量,但在变量的名称前面加上一个'*'。例如,您可以声明一个整数如下

int a;

要创建指向'a'的指针,请创建一个与a类型相同的新变量,并在其前面放一个'*'。因此,指向上述变量'a'的声明将看起来像

int * p;

请注意,除了附加的'*',它的声明是相同的。现在'p'是指向整数变量的指针。

现在考虑你想要另一个指针指向这个变量'p'。再次声明一个类似'p'的变量,并在其前面放一个'*'。因此,对上述变量的指针声明将看起来像

int ** pp;

再次注意,除了一个额外的'*'这个声明与'p'声明非常相似。所以变量“PP”是指针一个指向整数

您可以以同样的方式声明指针到“PP”和循环将持续下去。对于非简单类型也是如此,即指向类或结构类型变量的指针是以相同方式创建的。

+0

我认为'* p'不一定是变量't'的*值*,而是变量*'t'本身:) – fredoverflow 2010-07-16 11:06:55

2

例如,你可以用这个函数中创建对象:

void create(Type** result) 
{ 
    *result = new Type(); 
} 

//somewhere else in code 
Type* object; 
create(&object); 

这对于创建单个对象的void函数并没有多大的意义,但是如果函数需要一些预定义的返回类型或者需要创建多个会使得感知的对象。一个典型的例子是IUnknown::QueryInterface()必须返回HRESULT

HRESULT CYourClass::QueryInterface(IID& iid, void** result) 
{ 
    //inside you need to decide whether you know the iid passed, copy a pointer 
    // into *ppv and then return apropriate HRESULT 
} 
+0

我可以使用指针的指针访问我们使用第一个指针的变量吗? – 2010-07-16 06:14:13

+0

是的,当然 - 使用'int ** pp =&p;'通常称为“指针指针”。 – sharptooth 2010-07-16 06:15:54

3

它的一个指针的指针。

例如,如果你的操作是在一个函数:

void make_p(int **p, int *t) { 
*p = t; 
} 

int main() { 
int *p; 
int t; 
make_p(&p, &t); 
} 
1

它,所以我们可以有其他指针指向改变。指向指针的指针。考虑以下几点:

int *p1 = &j; // j is a int. 
int *p2 = &k; // k is an int. 

int **p; 

p = &p1; //p points at p1. 
*p = p2; //p1 now points to j because p2 is pointing to j. 
//Also we can do this through just plain old variables. 
int l; 
*p = &l; //p1 is now pointing at l 
0

正如int *p;定义的指针intint **s;限定一个指针(一个指向int)。这通常出现在两种情况下:

首先,如果你想保存的指针为int数组,你会做这样的事情:int **arr = malloc(sizeof(int*) * arr_size);

其次,当一个函数需要返回多个值,通过引用返回额外的值是很常见的。 I.e .:

/* Return x, y and error code. */ 
int getVals(int *px, int *py) { 
    *px = x; 
    *py = y; 
    return 0; 
} 

/* Return new object and error code. */ 
int newFoo(struct Foo **out_foo) { 
    struct Foo *f = malloc(sizeof(struct Foo)); 
    f->value = 0; 
    *out_foo = f; 
    return 0; 
}