【问题标题】:assigning an address to a pointer为指针分配地址
【发布时间】:2016-01-07 11:56:53
【问题描述】:

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

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

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

int *ptr = &a;

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

【问题讨论】:

  • int *ptr;时声明一个指针。编写 *ptr 时,您分配 à 值。它是改变 * 运算符含义的声明
  • 你也可以写int a = 10, *ptr = &a; :) 它们是一样的
  • 第一个和第二个例子不一样,但结果是一样的。 1)第一个声明int *ptr;,然后进行分配ptr = &a; 2)第二个:int *ptr = &a;这里声明和初始化正在发生。

标签: c++ c pointers


【解决方案1】:

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

【讨论】:

  • 感谢您的回答!我现在明白了很多:)
【解决方案2】:

int *ptr; ptr = &a;int *ptr = &a; 就像 int n; n = 3;int n = 3;

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

【讨论】:

  • 谢谢!现在我知道使用单线似乎不太危险,我会尝试更多地使用这种方法。
【解决方案3】:

不..它是在一行中声明和煽动。

这将清除想法..

typedef int* intp;

intp ptr=&a;

等价

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

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

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

Ans:- C 是上下文敏感的..基于使用它的上下文编译器决定它。

【讨论】:

  • 感谢您的回答! :)
【解决方案4】:

这两种方式是等价的吗?

是的。

第二个略受欢迎,因为第一个将 ptr 保留到最后一行(尽管实际上编译器可能会优化它)。

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

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

int *ptr;

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

int *ptr = &a;

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

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

【讨论】:

  • 非常感谢您的回答,它有助于理清概念。我没想到会有这么多答案,每个答案都在帮助我理解这个概念,所以无法接受你的答案。不过非常感谢! :)
  • 没问题@QPTR,我很高兴它有帮助。
【解决方案5】:

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

所以int *ptr = &a 表示ptrint * 类型的变量,它已被分配&a

*ptr = a 表示variable stored at address ptr(取消引用ptr),它被分配了a

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多