设置地址和指针的初始化

时间:2009-11-11 05:16:51

标签: c

首先,我很抱歉我的英语不好,这不是我的第一语言。

这是我第一次学习指针,我发现这很奇怪。

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

但是当我尝试初始化指针时

int a;
int *pA =&a;

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

  

* PA =&安培;一个;

不起作用,

  

PA =&安培;一个;

作品。

所以我的查询是“初始化指针和替换之间有什么区别?”

4 个答案:

答案 0 :(得分:3)

int a;

这会在堆栈上分配一个整数

int* pA = &a;

这会在堆栈上分配一个int指针,并将其值设置为指向a。 '*'是声明的一部分。

*pA = &a;

在这种情况下,'*'是一个操作符,表示“查看pA指向的位置”,这是一个int。然后,您尝试将该int设置为a的地址,这是不允许的。

pA = &a;

现在这与第二个声明相同。它将pA的值设置为指向a。

答案 1 :(得分:1)

在C中,“声明模仿使用”

当您声明指向int

的指针时
int *pa;

您可以看到paint **paint

您可以将指针指定给pa的int,或者可以为*pa指定整数。
这就是为什么在上述声明之后,以下陈述“有效”。

*pa = 42;
pa = &a;

在声明本身中,您可以通过提供初始化值将其“转换”为定义。该定义适用于pa类型的对象int*,而不适用于*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` */

答案 2 :(得分:0)

创建指针时,使用

int *pA;

之后,使用*pA表示您正在访问指针指向的

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

因此,正确的分配是pA = &a,因为您要将a的地址复制到pA,该地址应该包含内存位置的地址。

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

答案 3 :(得分:0)

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

所以,你可以这样做:

int a; 
int *pA = &a;

你可以这样做:

pA = &a;

但你不能这样做:

*pA = &a;

因为这样说,“将pA =指向的值设为a的值。”

但是,你可以这样做:

*pA = a;

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