给指针分配地址

6
我想知道是否有其他方法来将指针指向的地址赋值给它。例如,通常的方法是:
int a = 10;
int *ptr;
ptr = &a;

但是在某些地方,我看到它被声明为:

int *ptr = &a;

这两种方法都等同吗?我有点困惑,因为我一直认为*ptr给出的是a的值,而不是地址。请问有人可以解释一下吗?谢谢。

2
当写下 int *ptr; 时,你声明了一个指针。当写下 *ptr 时,你赋值给了一个值。它是声明改变了 * 运算符的含义。 - loginn
1
你也可以写成 int a = 10, *ptr = &a; :) 它们是一样的东西。 - Elias Van Ootegem
1
第一个和第二个例子不同,但结果相同。1)首先声明int *ptr;,然后进行赋值ptr = &a; 2)第二个:int *ptr = &a; 这里同时进行了声明和初始化。 - Michi
5个回答

9
我有点困惑,因为我一直认为*ptr是给出变量a的值,而不是地址。
这确实有点令人困惑,因为*用于声明指针,并且也用作取消引用运算符。实际上,*的含义取决于上下文 - 它是在声明、初始化还是赋值中使用。
值得了解1)声明、2)初始化和3)赋值之间的区别。
int *ptr; // 1) this is declaration without initialisation.

int *ptr = &a; // 2) this is declaration **and** initialisation (initialise ptr to the address of variable a)

int b = 10;
*ptr = b;   // 3) this is assignment, assign what pointed by ptr to value of variable b.
  • 在1)中,*表示ptr是一个指向int类型的指针(但它还没有指向任何有效的位置)。
  • 在2)中,*表示ptr是一个指向int类型的指针,并且它的初始值是变量a的地址。
  • 在3)中,*是解引用运算符,即将ptr所指向的值赋值给变量b

谢谢回答!我现在理解得更好了 :) - QPTR

2

int *ptr; ptr = &a;的意思就是int *ptr = &a;,就像int n; n = 3;的意思是int n = 3;一样。

也就是说,指针声明和初始化与普通变量没有区别。如果可能的话,我更喜欢使用一行代码来初始化变量,因为这样不容易出现未初始化的变量。


谢谢!现在我知道使用这种单行代码貌似没那么危险了,我会尽量多采用这种方法。 - QPTR

2

这两种方式都是等效的吗?

是的。

第二种方式略微更受欢迎,因为第一种方式会使ptr在最后一行之前未被分配(尽管实际上编译器可能会对其进行优化)。

我有点困惑,因为我一直认为*ptr是给出a的值,而不是地址。

您将声明变量的语法与使用该变量的语法混淆了。

int *ptr;

这段代码声明了一个名为ptr的变量,它是一个指向整数的指针。

int *ptr = &a;

这段代码完全相同。第一部分仍然只是指针的声明,与以前一样。等号后面的部分将 ptr 初始化为 a 的地址。

您是正确的,在声明后,当您在后续代码中使用此变量并指定*ptr时,将给出指针的内容(在本例中为a的值)。


1
非常感谢您的回答,它帮助我澄清了这个概念。我没有想到会有这么多答案,每一个答案都帮助我理解这个概念,所以我不能接受您的答案。但是非常感谢! :) - QPTR
1
没问题 @QPTR,我很高兴能帮到你。 - GrahamS

2
这是一行中的声明和初始化。这将澄清这个想法。
typedef int* intp;

intp ptr=&a;

同义地

intp ptr; //int *ptr;
ptr=&a;   // ptr=&a;

答案是:是的,它们是等价的。

你可能会问: :- 编译器如何理解?(* 是间接引用还是声明中的符号)

答案:C 是上下文相关的。根据使用时的上下文,编译器会做出决定。


谢谢你的回答! :) - QPTR

1
如果在声明变量时使用*运算符,则仅用于指示正在声明的变量的类型。而在所有其他情况下,*运算符都用作解引用运算符(除非它用作乘法运算符)。
因此,int *ptr = &a表示ptr是类型为int *的变量,已分配&a*ptr = a表示被存储在地址ptr处的变量(解引用ptr),其被赋值为a

谢谢你的回答! - QPTR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接