为指针分配地址

时间:2016-01-07 11:56:54

标签: c++ c pointers

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

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

但在某些地方我认为它声明如下:

int *ptr = &a;

这两种方式都相同吗?我有点困惑,因为我总是认为* ptr给出a的,而不是地址。有人可以解释一下吗?感谢。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

No ..it是一行中的声明和intiliaz。

这将清除这个想法..

typedef int* intp;

intp ptr=&a;

等价

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

答案是:是的,他们是等同的。

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

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

答案 2 :(得分:2)

  

这两种方式都相同吗?

是。

第二个是边缘首选,因为第一个离开ptr未分配直到最后一行(虽然实际上编译器可能会优化它)。

  

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

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

int *ptr;

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

int *ptr = &a;

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

的地址

你说明你后来在后面的代码*ptr中使用这个变量的声明后,你会得到指针的内容(在这种情况下是a的值)。

答案 3 :(得分:1)

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

也就是说,指针声明和初始化与正常变量没有区别。我希望尽可能使用一行,因为没有未初始化变量的危险性较小。

答案 4 :(得分:1)

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

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

并且*ptr = a表示variable stored at address ptr(解除引用ptr),正在分配a