2009-11-11 118 views
3

首先,我为我可怜的英语感到抱歉,这不是我的第一语言。设置地址并初始化指针

这是我第一次研究指针,我发现它真的很奇怪。

我正在阅读的书说* marker表示'pa'表示的变量。

但是当我尝试并初始化一个指针

int a; 
int *pA =&a; 

(它们在这种情况下使用*pA),然后改变它,

* PA =&一个;

不起作用,和

PA =&一个;

工程。

所以我的查询是“是否有初始化指针之间的任何区别,只是代??”

+0

欢迎SO。 :) – BobbyShaftoe 2009-11-11 05:22:44

+0

Ty,认为这个地方真棒,人们善良,聪明。 希望我可以像你们一样,然后我可以帮助在C领域有需要的人。 – Rhee 2009-11-11 05:26:22

回答

3
int a; 

此堆栈

int* pA = &a; 

这在栈上分配一个int指针并将其值,以指向上分配的整数。 '*'是声明的一部分。

*pA = &a; 

在这种情况下,'*'是一个运算符,表示“看哪里pA点”,这是一个int。然后你试图将int设置为a的地址,这是不允许的。

pA = &a; 

现在这与第二条语句相同。它将pA的值设置为指向a。

+0

我也很好奇当我分配一个指针和一个变量。 > int a,* p1; < - 像这样 它工作!让我觉得'*'包含在指针中。 – Rhee 2009-11-11 11:29:02

+0

这只是两个单独声明的简写。 *仍然是p1的声明(int *)的一部分。我同意这不完全直观,你只需要习惯它。在声明中,*是类型的一部分。作为一个操作员,它有不同的(但相关的)含义。 – 2009-11-11 14:25:42

0

当您创建一个指向您使用

int *pA;

之后,使用*pA意味着你访问价值指向指针

当您使用&a时,您使用的是Address-of Operator,它返回存储变量a(它是一个整数)的数据所存储的内存位置的地址。

因此,正确的作业是pA = &a,因为您正在将地址a复制到pA,该地址应该保存内存位置的地址。

*pA代表该内存位置中的值(整数),因此将地址分配给*pA不正确 - 这就是为什么正确的语法是pA = &a

0

是的,当你第一次声明一个指针时,你可以指定内存地址。因为您将它声明为指针,所以您使用*运算符。但在其他地方,*pA意味着采用该指针引用的值(而不是实际地址)。这有点奇怪,但你已经习惯了。因为,说,“让

*pA = &a; 

所以,你可以这样做:

int a; 
int *pA = &a; 

,你可以这样做:

pA = &a; 

但你不能做由pA =指向值的值。“

但是,你可以这样做:

*pA = a; 

这就是你是如何设置的值通过pA的指向。希望这有点清楚。

0

在C,“宣言模仿使用”

在声明指针int

int *pa; 

你可以看到,paint **paint

您可以将指针指向int到pa,或者您可以将int指定为*pa
这就是为什么在上面的声明之后,下面的语句“工作”。

*pa = 42; 
pa = &a; 

在声明本身中,可以通过提供初始化值将其“转换”为定义。该定义适用于int*类型的对象pa,而不是*pa

int *pa = &a; /* initialize pa, which takes a `int*` */ 
pa = &b;  /* change `pa` with a different `int*` */ 
*pa = 42;  /* change the value pointed to by `pa` */