2016-03-06 35 views
1

我在学习C编程,并且我看到了一些代码,其中人们使用双指针。我做了一些从下面搜索stackoverflow,但仍然有一个小小的问题(Why use double pointer? or Why use pointers to pointers?双指针的定义

在下面的代码中,我的问题是我没有定义'b'为** b。现在我试图做 (* b)我得到一个编译错误。不是这个*(* b)与 *(c的地址)相同,因为'a'的地址是'c'。为什么我需要将'b'定义为** b才能真正获得'c' ?

#include <stdio.h> 

int main() 
{ 
    int *a, *b, c; 
    c = 10; 
    a = &c; 
    b = &a; 
    printf("*a - %d\n *(*b): %d\n," , *a, *(*b)); 
    return 0; 
} 

帮助/解释非常感谢:)

编辑:非常感谢球员的解释。事情现在已经清楚:)

+1

当你声明一个指向整数的指针时, 'int * a'。现在,没有什么像一个“双指针”,但有一些东西像指针指向一个整数。这应该有希望给你一些问题的提示。 –

+0

你已经告诉你的编译器b是一个指向一个整数的指针,但是你试图将它设置为指向一个整数的指针的地址。 “a”是指向一个整数的指针,“&a”不是。如果你改变“int * a,* b,c;”到“int * a,** b,c;”它会编译。 – hft

+0

'int * a,* b,c;'表示'b'包含一个指向整数的指针。但是'b =&a;'试图让'b'把指针的地址保存为一个整数。这是什么,'b'持有指向整数的指针还是指向整数的指针的地址? –

回答

0

这是一个工作代码。

int main() 
{ 
int *a, *b, c; 
c=10; 
a = &c; 
b = a; 
printf("*a - %d\n *(*b): %d\n,",*a, *(b)); 
return 0; 
} 

指针是贴切的名字:他们 “点” 到内存中的位置。

当你写*b,你告诉你要声明整数类型的指针,它指向一个整数的编译器。 当你使用b = a时,你告诉编译器你也将c的地址分配给a。实际上,b是存储整数变量c的地址的指针变量。所以,这样,您可以将一个变量的地址分配给另一个指针。

现在,关于你的代码,

int main() 
{ 
int *a, **b, c; // just change it from *b to **b 
c = 10; 
a = &c; 
b = &a; 
printf("*a - %d\n *(*b): %d\n,",*a, *(*b)); 
return 0; 
} 

你需要写2 *。当你写**b指定编译器指针b是指针的指针变量,你告诉编译器指出你正在指向另一个指针变量。同样,你也可以有三重指针和四重指针。
以下是供您参考的链接。 http://www.c4learn.com/c-programming/c-double-pointer/

0

您可以访问使用*b的的c值..更改代码littlebit ..

#include <stdio.h> 
    int main() 
    { 
     int *a, *b, c; 
     c = 10; 
     a = &c; 
     b = a; 
     printf("*a :%d\n *b: %d\n,",*a, *b); 
      return 0; 
    } 


*b,*a 

定义ab两个指针变量..

a=&c; 

分配地址变量c指针a .. &代表地址运营商。

b=a; 

复制的ab包含..现在b还包含c地址..

打印*a*b ..*a*b表示包含ab。所以*a*b将打印的c值..

您还可以使用**b ... **b意味着b是其存储另一指针变量的地址的指针..

在这种情况下,代码会,

#include <stdio.h> 
    int main() 
    { 
     int *a, *b, c; 
     c = 10; 
     a = &c; 
     b = &a; 
     printf("*a :%d\n *b: %d\n,",*a, *(*b)); 
     return 0; 
     } 

a包含cb地址包含的a地址。所以,*a将打印的值..

由于b是我们需要*(*b)访问包含b .. *(*b)也将打印的c值双指针..

0

在代码中,你所要做的int **b;因为:

apointer-to-integer,因为a = &c。因为你写了b = &a