2014-03-05 290 views
0

一个非常普遍的问题:我想知道为什么我们使用指针指针? 指向指针的指针将保存指针的地址,指针又指向另一个指针。但是,即使使用单个指针也可以实现这一点。为什么指向指针?

请看下面的例子:

{ 
    int number = 10; 
    int *a = NULL; 

    a = &number; 

    int *b = a; 

    int *pointer1 = NULL; 
    pointer1 = b; //pointer1 points to the address of number which has value 10 

    int **pointer2 = NULL; 
    pointer2 = &b; //pointer2 points to the address of b which in turn points to the address of number which has value 10. Why **pointer2?? 

    return 0; 
} 
+3

指针2不指向数值10.它指向b的地址,它是一个指针,因此指向指针。 – Cristy

+0

'* pointer2!= 10','* pointer2 == b','** pointer2 == 10' – rozina

回答

1

以下表达式为真:

*pointer2 == b 
**pointer2 == 10 

以下是不!

*pointer2 == 10 

当您想要改变指针指向函数外部的指针时,指针指针可能很有用。例如

void func(int** ptr) 
{ 
    *ptr = new int; 
    **ptr = 1337; 
} 

int main() 
{ 
    int* p = NULL; 
    func(&p); 
    std::cout << *p << std::endl; // writes 1337 to console 
    delete p; 
} 

愚蠢的例子来说明什么可以实现:)只需一个指针不能这样做。

0

你的假设是不正确。 pointer2不指向值10,而是指向指针b的(地址)。解除引用pointer2*运算符会生成int *而不是int

由于您需要指针的原因相同,您需要指针指针:在函数调用中实现传递引用参数,实现数据结构之间的数据共享等等。

3

我想你回答了你自己的问题,代码是正确的,你评论的不是。

int number = 10;是价值

int *pointer1 = b;点,其中int数量保持

int **pointer2 = &b;点到的整型数字地址保存

你在这里看到的模式地址的地址?

address = * (single indirection) 

address of address = ** (double indirection) 
0

一个简单的例子是矩阵的实现(这是一个例子,它不是用C++实现矩阵的最佳方式)。

int nrows = 10; 
int ncols = 15; 
double** M = new double*[nrows]; 
for(unsigned long int i = 0; i < nrows; ++i) 
    M[i] = new double[ncols]; 
M[3][7] = 3.1416; 
+0

与OP询问的问题相比,这有些进步,您可以找到一个没有内存分配的例子。 –

2

首先,一个指针不指向一个值。它指向一个内存位置(即它包含一个内存地址),它又包含一个值。所以,当你写

pointer1 = b; 

pointer1指向相同的内存位置为b是变量number。现在,在这之后你执行

pointer2 = &b; 

然后pointer2点的b不包含10内存位置,但可变number

0

地址你会很少看到这种结构在普通的C++代码,因为C++有引用。这是有用的下“通过引用传递:”

int allocate_something(void **p) 
{ 
    *p = malloc(whatever); 
    if (*p) 
    return 1; 
    else 
    return 0; 
} 

等效C++代码将使用void *&p为参数。

尽管如此,你可以想象如资源监视器这样的:

struct Resource; 

struct Holder 
{ 
    Resource *res; 
}; 

struct Monitor 
{ 
    Resource **res; 

    void monitor(const Holder &h) { res = &h.res; } 
    Resource& getResource() const { return **res; } 
} 

是的,这是人为的,但这个想法的存在 - 这将指针保持存储在一个支架上的指针,并正确返回的资源,即使持有人的res指针的变化。

当然,这是一个悬而未决的等待发生 - 通常,你会避免这样的代码。

0

在c这样的构造是有意义的,具有更大的数据结构。 C中的OOP由于缺少实现具有结构的方法的可能性,因此该方法显式传递了参数C++ this。还有一些结构是由一个指向一个特定选定元素的指针定义的,该元素保存在方法的全局范围内。

所以,当你想通过整个结构,例如,一棵树,并且需要更改根或列表的第一个元素,则会将指针指向此特殊元素,因此您可以更改它。

注意:这是c风格的实现,使用C++语法来实现。

void add_element_to_list(List** list, Data element){ 
    Data new_el = new Data(element); // this would be malloc and struct copy 
    *list = new_el; //move the address of list, so it begins at new element 
} 

在C++中有参考机制,你通常可以用它来实现几乎任何东西。它基本上使用了所有已经过时的指针,至少在许多情况下是这样。你也可以设计物体并对它们进行处理,并且一切都隐藏在这两个罩子下面。

最近还有一个不错的问题“为什么我们在C++中使用指针?”或类似的东西。

相关问题