我想知道是否有其他方法可以为指针分配指向其值的地址。例如,通常的方式是:
int a = 10;
int *ptr;
ptr = &a;
但在某些地方我认为它声明如下:
int *ptr = &a;
这两种方式都相同吗?我有点困惑,因为我总是认为* ptr给出a的值,而不是地址。有人可以解释一下吗?感谢。
答案 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.
*
表示ptr
是指向int
的指针(但尚未指向任何有效位置)。*
表示ptr
是指向int
的指针,其初始值是变量a
的地址。*
是解引用运算符,即将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
表示ptr
是int *
类型的变量,已被分配&a
并且*ptr = a
表示variable stored at address ptr
(解除引用ptr
),正在分配a
。