试图理解 * 和 & 在C++
Trying to understand * and & in C++
我有几个问题。这不是家庭作业。我只是想更好地理解。
所以如果我有
int * b = &k;
-
那么
k
必须是一个整数,而b
是指向k
在内存中位置的指针,对吗? -
b
的底层"数据类型"是什么?当我输出它时,它会返回类似0x22fe4c
的东西,我认为它是内存位置2293324
的十六进制,对吗? -
记忆位置"2293324"究竟在哪里?"堆"?如何输出内存位置
0
、1
、2
等处的值? -
如果我输出
*b
,这与直接输出k
相同,因为*
在某种程度上意味着b
指向的值。但这似乎与b
的声明不同,后者被声明为int * b = k
,所以如果*
的意思是"的值",那么这不意味着"将b
声明为k
的值吗?我知道不是,但我仍然想确切地理解这在语言方面意味着什么。 -
如果我输出
&b
,这实际上是返回指针本身的地址,与k
无关,对吗? -
我也可以做
int & a = k;
,这似乎和做int a = k;
一样。是否通常没有必要以这种方式使用&
?
1-是。
2-没有"基础数据类型"。它是指向int的指针。这就是它的本质。它的数据类型与c/c++的"int"或"char"相同。
3-你甚至不应该尝试内存的输出值,这不是你分配的。这是一个分割错误。你可以尝试做b-(这使得"b"指向实际位置之前的"int"。至少,指向你的程序认为它是int的地方。)
带指针的4-*是一个运算符。对于任何数据类型,它都是另一种数据类型。它就像=符号。当你输入==时,它有一个含义,当你输入=时,它又有另一个含义。这个符号并不一定与它的含义相关。
5-&b是b的方向。它与k有关,而b指向k。例如,如果你做了(**(&b)),你就得到了由b的方向指向的值所指向的值。这就是k。当然,如果你没有改变它。
6-int & a = k
表示将a的方向设置为k的方向。对于所有均值,a
将为k。如果您执行a=1,则k将为1。它们都是对同一事物的引用。
当然,还有待更正。这就是我的理解。
回答您的问题:
-
是的,
b
是pointer
到k
:它包含堆中k
的地址,但不包含k
本身的值。 -
b
的"数据类型"是int
:本质上,这告诉我们b
指向的地址是int
的地址,但这与b
本身无关:b
只是变量的地址。 -
不要试图手动将内存分配给特定地址:内存是根据初始化后对象的大小分配的,因此内存地址是间隔开的,以便为内存中相邻分配的对象留出空间,因此手动更改这是个坏主意。
-
*
在这种情况下是对b
的取消引用。正如我所说的,b
是一个内存地址,但*b
是b
地址上的。在这种情况下,它是k
,因此操作*b
与操作k
相同。 -
正确,
&b
是指针的地址,它不同于k
和b
本身。 -
使用
int & a = k
是创建对k
的引用,可以将其用作k
本身。然而,这种情况并不重要,引用对于需要更改函数本身范围之外的变量值的函数来说是理想的。
例如:
void addThree(int& a) {
a += 3;
}
int main() {
int a = 3; //'a' has a value of 3
addThree(a); //adds three to 'a'
a += 2; //'a' now has a value of 8
return 0;
}
在上述情况下,addThree
引用a
,这意味着main()
中int a
的值由函数直接操纵。
这也适用于指针:
void addThree(int* a) { //Takes a pointer to an integer
*a += 3; //Adds 3 to the int found at the pointer's address
}
int main() {
int a = 3; //'a' has a value of 3
addThree(&a); //Passes the address of 'a' to the addThree function
a += 2; //'a' now has a value of 8
return 0;
}
但是而不是带有复制构造的参数:
void addThree(int a) {
a += 3; //A new variable 'a' now a has value of 6.
}
int main() {
int a = 3; //'a' has a value of 3
addThree(a); //'a' still has a value of 3: The function won't change it
a += 2; //a now has a value of 5
return 0;
}
相互称赞。*
要么声明指针,要么取消引用。&
要么声明(左值)引用,要么获取对象或内置类型的地址。因此,在许多情况下,它们协同工作。要制作对象的指针,您需要它的地址。要使用指针作为值,您可以取消引用它。
3-如果k是一个局部变量,则它在堆栈上。如果k是一个静态变量,它在程序的数据部分。这同样适用于任何变量,包括b。指针将指向堆中的某个位置,if new,malloc(),calloc(),使用。如果使用alloca()(或_alloca()),指针将指向堆栈(alloca(类似于使用局部可变长度数组)。
涉及阵列的示例:
int array_of_5_integers[5];
int *ptr_to_int;
int (*ptr_to_array_of_5_integers)[5];
ptr_to_int = array_of_5_integers;
ptr_to_array_of_5_integers = &array_of_5_integers;
- 没有找到相关文章