试图了解*和&用C ++

时间:2015-12-25 22:19:05

标签: c++ pointers memory

我有几个问题。这不是功课。我只想更好地理解。

所以,如果我有

int * b = &k;

  1. 然后k必须是整数,b是指向k在内存中的位置的指针,对吗?

  2. b的基础“数据类型”是什么?当我输出它时,它返回0x22fe4c之类的东西,我假设它是十六进制的内存位置2293324,对吗?

  3. 记忆位置'2293324'究竟在哪里? “堆”?如何输出值,例如,记忆位置012等?

  4. 如果输出*b,则与直接输出k相同,因为*以某种方式表示b指向的值。但这似乎与声明为b的{​​{1}}声明不同,因此,如果int * b = k表示“价值”,那么并不意味着“声明*b?我知道它没有,但我仍然想要明白这意味着什么是语言明智。

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

  6. 我也可以k执行与int & a = k;相同的操作。通常没有必要以这种方式使用int a = k;吗?

4 个答案:

答案 0 :(得分:2)

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 :(得分:2)

回答您的问题:

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

  2. "数据类型" b的{​​{1}}是int:基本上,这告诉我们b点的地址是int的地址,但这与{{b无关。 1}}本身:b只是变量的地址。

  3. 不要尝试手动将内存分配给特定的地址:内存根据初始化后的对象大小进行分配,因此内存地址间隔开,以便为每个对象分配对象留出空间其他在记忆中,因此手动改变这是一个坏主意。

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

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

  6. 使用int & a = k正在为k创建引用,可以将其用作k本身。这种情况很简单,但是,对于需要改变函数本身范围之外的变量值的函数,引用是理想的。

  7. 例如:

    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,这意味着int amain()的值会被函数直接操纵。

    这也适用于指针:

    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;
    }
    

答案 2 :(得分:1)

彼此称赞。 *要么声明指针,要么取消引用它。 &要么声明一个(左值)引用,要么取一个对象或内置类型的地址。因此,在许多情况下,它们协同工作。要创建对象的指针,您需要其地址。要将指针用作值,请取消引用它。

答案 3 :(得分:1)

3 - 如果k是局部变量,它就在堆栈上。如果k是静态变量,则它在程序的数据部分中。这同样适用于任何变量,包括b。如果使用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;