首先,我很抱歉我的英语不好,这不是我的第一语言。
这是我第一次学习指针,我发现这很奇怪。
我正在阅读的书中说*
标记表示'pa'表示的变量。
但是当我尝试初始化指针时
int a;
int *pA =&a;
(他们在这种情况下使用*pA
)然后更改它,
* PA =&安培;一个;
不起作用,
PA =&安培;一个;
作品。
所以我的查询是“初始化指针和替换之间有什么区别?”
答案 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;
您可以看到pa
是int *
或*pa
是int
。
您可以将指针指定给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指向的值。希望这有点清楚。