C++

C++指针和地址

C++指针和地址

Posted by Hux on February 23, 2020

C++的指针和地址。

指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。

什么是指针。

  • 指针可以看作是JOJO里的替身,替身使者+独有技能。
  • & 是取出某变量的地址。指针就是来表示一个变量的值和地址。int *ptr = &icount;
  • ptr 输出得到的是icount的地址,对*ptr输出得到的是icount的值。
  • 指针作为变量也有自己的地址。比如&ptr,输出就会得到指针地址的位置。

怎样创建指针。

1
2
3
4
5
6
int icount = 18;
int *ptr = &icount;

int *ptr = null;
int x = 8848;
ptr = &x;

使用样例

  • Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    int main()
    {
    
      int icount = 18;
      int* ptr = &icount;
      cout << "ptr =        " << ptr << endl;
      cout << "*ptr =       " << *ptr << endl;
      cout << "&ptr =       " << &ptr << endl;
      cout << "&icount =    " << &icount << endl;
      *ptr = 58;
      puts("*ptr = 58; --------------------");
      cout << "icount =     " << icount << endl;
      //cout << "*icount = " << *icount << endl;
      cout << "&icount =    " << &icount << endl;
    
      cout << "ptr =        " << ptr << endl;
      cout << "*ptr =       " << *ptr << endl;
      cout << "&ptr =       " << &ptr << endl;
    
      icount = 111100;
      puts("icount = 111100;  ----------------");
      cout << "icount =     " << icount << endl;
      //cout << "*icount = " << *icount << endl;
      cout << "&icount =    " << &icount << endl;
    
      cout << "ptr =        " << ptr << endl;
      cout << "*ptr =       " << *ptr << endl;
      cout << "&ptr =       " << &ptr << endl;
    
      int x = 8848;
      ptr = &x;
    
      cout << "ptr =        " << ptr << endl;
      cout << "*ptr =       " << *ptr << endl;
      cout << "&ptr =       " << &ptr << endl;
    }
    
  • Output
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    ptr =        0093F944
    *ptr =       18
    &ptr =       0093F938
    &icount =    0093F944
    *ptr = 58; --------------------
    icount =     58
    &icount =    0093F944
    ptr =        0093F944
    *ptr =       58
    &ptr =       0093F938
    icount = 111100;  ----------------
    icount =     111100
    &icount =    0093F944
    ptr =        0093F944
    *ptr =       111100
    &ptr =       0093F938
    ptr =        0093F92C
    *ptr =       8848
    &ptr =       0093F938
    

    函数中指针的使用。

    函数中有三种参数传递方式。

  • 值传递。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    void swap(int a, int b)
    {
      int t= a;
      a=b;
      b=t;
    }
    int main()
    {
      int a =1;
      int b =2;
      swap(a,b);
    }
    

    以上不会发生a,b值替换。传进去的a和b是形参,a和b的地址与函数被调用时传入实参的地址不一样所以无法发生值替换。 简单来说,形参a,b仅仅和调用时传入的实参值一样,其它所有特性完全独立,无法替代传入的实参。

  • 地址传递。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    int swap(int *x, int *y)
    {
      int temp;
      temp = *x; 
      *x = *y; 
      *y = temp;
      return temp;
    }
    int main()
    {
     
      int a = 1, b = 2;
      int *p1 = &a;
      int *p2 = &b;
      swap(p1, p2);
      //swap(&a,&b);
    }
    

    此时的指针 x y 指向 a, b 地址。*x 和 *y 就可以直接对 a, b 地址上对应的值进行操作。

  • 引用传递
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    void swap(int &x, int &y)
    {
      int t = x;
      x = y;
      y = t;
    }
    int main()
    {
      int a = 3, b = 4;
      swap(a, b);	
    }
    

    此时直接传入的就是 a, b的地址, x, y值和地址都跟 a, b 一样,基本就可以看作 a, b 换了个 x, y 的名字。

    多重引用。

    待更新。。。