2017-06-15 126 views
-3
int main(int argc, char *argv[]) 
{ 
    int *p=5,**P; 
    printf("%d",&P); 
} 

* p和** P有什么区别?这两个指针有什么区别?

+0

你用'p'小写和'P'大写?是的,这是可读的,不会令人困惑... – bolov

+0

如果你想声明一个指向一个int值为5的变量,你应该写'int x = 5; int * px =&x;'。然后,您可以使用正确的格式说明符printf(“%p”,px);'来打印该内存地址。 –

+0

对于'int * p = 5',你声明一个类型为'int *'的变量'p'(或者指向int的指针),并且为p赋予内存地址'5',不管它包含什么(可能不是int)一个int值为5的变量的地址。这是一个[bad idea](https://ideone.com/2H0adX)。 –

回答

1

* p是指向一个int等于5

** P是一个指向指针的指针,它是一个包含一个地址的变量。

指针是一个包含地址的变量。在你的电脑中,每个变量都存储在内存中的某个地方。变量放置的确切位置称为变量地址。

用指针可以知道另一个变量的确切地址。

int c = 5; // this value of this int is stored at a certain address; 
int *p = &c; // the pointer p now contains the address where 5 

请记住,* P是可变太,因此在某处存储在存储器中为好。

int **P = &p ; // a double pointer that contains the address of the pointer p 

这将是一个新的指针,指向存储p的地址(不是变量c!) - 一个指针;

+0

你能告诉我什么是指向一个指针吗?...它是一个地址的新地址 –

+0

感谢您的提示! 刚刚编辑我的答案;) – Eduard6421

0

单个星号代表一个指针,而双星号代表一个指向指针的指针。

0

* p是int的地址,等于5.所以在内存的某个地方,有一个int等于5,那个指针指向那个int的那个地址。

** p是内存中指针的地址。所以想想看,我们有一个指向上面int的指针,但现在最重要的是,我们有另一个指针指向int的指针。另一种考虑它的方法是我们有一个用于int的另一个地址的地址。

+0

好的谢谢.....所以如果我们有指针** A和A = 5,那么我们必须写&A来获得该值? –

+0

实际上,当我们在变量前面使用&时,这只会给我们地址。为了取消引用指针,我们必须使用*仍然这样做,但是一旦这样做仍然会给我们指针(地址)。我们将不得不再次解除引用,但这不是我们如何使用双指针。 通常情况下,我们使用双指针将正则指针传递给函数,所以我们保留真指针,因为否则就会复制它。这使我们能够使用该指针而不会丢失原始指针。我会在一秒内发布一个链接以显示我的意思。 –

+1

好吧,这有一个简单的方法来解释双指针及其用法:[link](https://stackoverflow.com/questions/5580761/why-use-double-pointer-or-why-use-pointers-to-pointers ) –