为指针分配地址

assigning an address to a pointer

本文关键字:地址 分配 指针      更新时间:2023-10-16

我想知道是否有其他方法可以为指针分配其指向的值的地址。例如,有一种常见的方法:

int a = 10;
int *ptr;
ptr = &a;

但在某些地方,我看到它被宣布为:

int *ptr = &a;

这两种方式等效吗?我有点困惑,因为我一直认为*ptr给出的是a的,而不是地址。有人能解释一下吗?谢谢

我有点困惑,因为我一直认为*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的值

int *ptr; ptr = &a;int *ptr = &a;的作用与int n; n = 3;int n = 3;的作用相同。

也就是说,指针声明和初始化与普通变量没有什么不同。我更喜欢尽可能使用一行,因为这样就不会有未初始化变量的危险。

否。。它是一行的声明和初始化。

这将澄清这个想法。。

typedef int* intp;
intp ptr=&a;

等价

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

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

你可以问-:-编译器如何理解?(无论*是间接的还是声明中的)

答:-C是上下文敏感的。。根据使用它的上下文,编译器决定它。

这两种方式等效吗?

是的。

第二个是略微优选的,因为第一个直到最后一行都没有分配ptr(尽管在实践中编译器可能会优化它)。

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

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

int *ptr;

只是声明一个名为ptr的变量,它是一个指向整数的指针。

int *ptr = &a;

做的完全一样。第一部分仍然只是指针的声明,就像以前一样。等号后的部分将ptr初始化为a 的地址

在声明之后,当您稍后在指定*ptr的后续代码中使用此变量时,您可以正确地获得指针的内容(在本例中为a的值)。

如果在声明时使用*运算符,那么它只用于指示要声明的变量的类型。而在所有其他情况下,*算子被用作解引用算子(除非它被用作乘法算子)。

因此,int *ptr = &a意味着ptrint *类型的变量,它已被分配给&a

并且*ptr = a意味着正在被分配avariable stored at address ptr(去引用ptr)。