试图理解 * 和 & 在C++

Trying to understand * and & in C++

本文关键字:C++      更新时间:2023-10-16

我有几个问题。这不是家庭作业。我只是想更好地理解。

所以如果我有

int * b = &k;

  1. 那么k必须是一个整数,而b是指向k在内存中位置的指针,对吗?

  2. b的底层"数据类型"是什么?当我输出它时,它会返回类似0x22fe4c的东西,我认为它是内存位置2293324的十六进制,对吗?

  3. 记忆位置"2293324"究竟在哪里?"堆"?如何输出内存位置012等处的值?

  4. 如果我输出*b,这与直接输出k相同,因为*在某种程度上意味着b指向的值。但这似乎与b的声明不同,后者被声明为int * b = k,所以如果*的意思是"的值",那么这不意味着"将b声明为k的值吗?我知道不是,但我仍然想确切地理解这在语言方面意味着什么。

  5. 如果我输出&b,这实际上是返回指针本身的地址,与k无关,对吗?

  6. 我也可以做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。它们都是对同一事物的引用。

当然,还有待更正。这就是我的理解。

回答您的问题:

  1. 是的,bpointerk:它包含堆中k的地址,但不包含k本身的值。

  2. b的"数据类型"是int:本质上,这告诉我们b指向的地址是int的地址,但这与b本身无关:b只是变量的地址。

  3. 不要试图手动将内存分配给特定地址:内存是根据初始化后对象的大小分配的,因此内存地址是间隔开的,以便为内存中相邻分配的对象留出空间,因此手动更改这是个坏主意。

  4. *在这种情况下是对b的取消引用。正如我所说的,b是一个内存地址,但*bb地址上的。在这种情况下,它是k,因此操作*b与操作k相同。

  5. 正确,&b是指针的地址,它不同于kb本身。

  6. 使用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;
相关文章:
  • 没有找到相关文章