为指针分配地址
assigning an address to a pointer
我想知道是否有其他方法可以为指针分配其指向的值的地址。例如,有一种常见的方法:
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
意味着ptr
是int *
类型的变量,它已被分配给&a
并且*ptr = a
意味着正在被分配a
的variable stored at address ptr
(去引用ptr
)。
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- LLVM 传递以在特定地址分配内存
- 如何按顺序或在指定的地址分配内存?
- C 内存地址分配
- 有没有其他方法可以将地址分配给指针变量
- 我可以将文件描述符的地址分配给变量
- 将地址分配给结构内的指针
- 如何将数组的地址分配给指针
- 尝试将派生类对象地址分配给基类指针的向量
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 在 c++ 中使用指针访问 2d 数组,如何将地址分配给指针
- 查询与将地址分配给共享_ptr有关
- 将非常量的地址分配给常量指针
- 类的地址分配
- 将 int 自己的地址分配给其值
- 如果指定了参数,如何将地址分配给函数指针
- std::bad_alloc从引用的地址分配指针
- 在该地址c++分配之前和之后相等指针之间的差异
- 在窗口中的特定地址分配数据