关于第二个指针的问题

时间:2010-07-16 06:07:06

标签: c++

我正在使用c ++,我对指针有些麻烦 我知道如果我们宣布一些变量

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

* p给出了变量t的地址,但在c ++中这里也定义了**为什么使用它?我已经阅读了但是我有一些误解请问有人可以举例说明如何使用吗?让我们看看给出的例子

5 个答案:

答案 0 :(得分:3)

它指向指针的指针。

例如,如果您的操作是在函数中:

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

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

答案 1 :(得分: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
}

答案 2 :(得分: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

答案 3 :(得分: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'的指针,循环将继续。对于非简单类型也是如此,即以相同的方式创建指向类或结构类型变量的指针。

答案 4 :(得分:0)

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

首先,如果你想要一个包含指向int的指针的数组,你可以这样做:int **arr = malloc(sizeof(int*) * arr_size);

其次,当函数需要返回多个值时,通常会通过引用返回额外的值。即:

/* 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;
}