指针(星号)的目的究竟是什么?

ian*_*hew 5 c++ pointers memory-address dereference

我是编程的新手,我正试图围绕"指针"的想法.


int main()
{
    int x = 5;
    int *pointerToInteger = & x;
    cout<<pointerToInteger;

}
Run Code Online (Sandbox Code Playgroud)

为什么当我 cout << pointerToInteger;输出是十六进制值时,但是当我使用cout << *pointerToInteger;输出时是5(x = 5).

R S*_*ahu 20

* 具体取决于具体情况.

  1. 声明指针

    int* ap;  // It defines ap to be a pointer to an int.
    
    void foo(int* p); // Declares function foo.
                      // foo expects a pointer to an int as an argument.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 取消引用表达式中的指针.

    int i = 0;
    int* ap = &i;   // ap points to i
    *ap = 10;       // Indirectly sets the value of i to 10
    
    Run Code Online (Sandbox Code Playgroud)
  3. 乘法运算符.

    int i = 10*20; // Needs no explanation.
    
    Run Code Online (Sandbox Code Playgroud)

  • `int* ap` 和 `int *ap`(样式除外)之间有区别吗? (6认同)
  • @ c.berger,不,没有。 (3认同)

bar*_*nos 6

如果声明某种类型的变量,则还可以声明另一个指向它的变量。

例如:

int a;

int* b = &a;

因此,从本质上讲,对于每个基本类型,我们也有一个对应的指针类型。

例如:shortshort*

有两种方法可以“查看”变量b(这可能会使大多数初学者感到困惑):

  • 您可以将其b视为type的变量int*

  • 您可以将其*b视为type的变量int

    因此,有些人会宣布int* b,而另一些人会宣布int *b

    但是,事实是这两个声明是相同的(空格是没有意义的)。

    您可以将其b用作指向整数值的指针,也可以*b用作实际的指向整数值。

    您可以获取(读取)目标值:int c = *b

    您可以设置(写入)指向的值:*b = 5


指针可以指向任何内存地址,而不仅指向先前声明的某个变量的地址。但是,在使用指针时必须小心,以获取或设置位于指向的内存地址的值。

例如:

int* a = (int*)0x8000000;

在这里,我们有a指向内存地址0x8000000的变量。

如果此内存地址未映射到程序的内存空间内,则使用任何读或写操作*a很可能会由于违反内存访问而导致程序崩溃。

您可以安全地更改的值a,但是您应该非常小心地更改的值*a


Cha*_*lie 5

一种看待它的方法,就是源/代码中的变量

int a=0;
Run Code Online (Sandbox Code Playgroud)

使'int a'引用内存中的值,0.如果我们创建一个新变量,这次是一个(可能更小的)"int指针" int *,并让它指向&a(a的地址)

int*p_a=&a; //(`p_a` meaning pointer to `a` see Hungarian notation)
Run Code Online (Sandbox Code Playgroud)

匈牙利表示法维基

我们得到p_a的价值&a是什么.你在谈论a现在的地址是什么,而*p_a是指向&a(a的地址)的指针.

当您想要修改内存中的值而不创建重复容器时,可以使用此选项.

p_a然而,它本身在内存中有一个足迹(可能比a它本身小),当你cout<<p_a<<endl;编写任何指针地址时,不是什么.*p_a但是会的&a.

p_a通常比a它本身小,因为它只是一个指向内存的指针,而不是值本身.那有意义吗?指针向量将比值向量更容易管理,但它们在许多方面都会做同样的事情.