zoukankan      html  css  js  c++  java
  • C++指针

    一、概述
    指针是一个变量,其值为另一个变量的地址
    举例:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    int var = 20; // 实际变量的声明
    int *ip; // 指针变量的声明
    
    ip = &var; // 在指针变量中存储 var 的地址
    
    cout << "Value of var variable: ";
    cout << var << endl;
    
    // 输出在指针变量中存储的地址
    cout << "Address stored in ip variable: ";
    cout << ip << endl;
    
    // 访问指针中地址的值
    cout << "Value of *ip variable: ";
    cout << *ip << endl;
    
    return 0;
    }

    在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。

    赋为 NULL 值的指针被称为指针。NULL 指针是一个定义在标准库中的值为零的常量。

    实例:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
       int  *ptr = NULL;
    
       cout << "ptr 的值是 " << ptr ;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    ptr 的值是 0

    二、C++指针算术运算

    指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-

    如:

    假设 ptr 是一个指向地址 1000 的 整型 int 指针

    ptr++

    ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节

    假设 ptr 指向一个地址为 1000 的字符 char

    上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001

    1.递增一个指针

    例如:

     

    #include <iostream>
     
    using namespace std;
    const int MAX = 3;
     
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
       int  *ptr;
     
       // 指针中的数组地址
       ptr = var;
       for (int i = 0; i < MAX; i++)
       {
          cout << "Address of var[" << i << "] = ";
          cout << ptr << endl;
     
          cout << "Value of var[" << i << "] = ";
          cout << *ptr << endl;
     
          // 移动到下一个位置
          ptr++;
       }
       return 0;
    }

     

    当上面的代码被编译和执行时,它会产生下列结果:

    Address of var[0] = 0xbfa088b0
    Value of var[0] = 10
    Address of var[1] = 0xbfa088b4
    Value of var[1] = 100
    Address of var[2] = 0xbfa088b8
    Value of var[2] = 200

    2. 递减一个指针

    同理

    3.指针的比较

    指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较

    例如:

    只要变量指针所指向的地址小于或等于数组的最后一个元素的地址 &var[MAX - 1],则把变量指针进行递增

    #include <iostream>
     
    using namespace std;
    const int MAX = 3;
     
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
       int  *ptr;
     
       // 指针中第一个元素的地址
       ptr = var;
       int i = 0;
       while ( ptr <= &var[MAX - 1] )
       {
          cout << "Address of var[" << i << "] = ";
          cout << ptr << endl;
     
          cout << "Value of var[" << i << "] = ";
          cout << *ptr << endl;
     
          // 指向上一个位置
          ptr++;
          i++;
       }
       return 0;
    }

    三、C++指针数组

    1. 指向整数的指针数组

    实例:

    #include <iostream>
     
    using namespace std;
    const int MAX = 3;
     
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
       int *ptr[MAX];
     
       for (int i = 0; i < MAX; i++)
       {
          ptr[i] = &var[i]; // 赋值为整数的地址
       }
       for (int i = 0; i < MAX; i++)
       {
          cout << "Value of var[" << i << "] = ";
          cout << *ptr[i] << endl;
       }
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Value of var[0] = 10
    Value of var[1] = 100
    Value of var[2] = 200

    2.指向字符的指针数组

    实例:

    #include <iostream>
     
    using namespace std;
    const int MAX = 4;
     
    int main ()
    {
     const char *names[MAX] = {
                       "Zara Ali",
                       "Hina Ali",
                       "Nuha Ali",
                       "Sara Ali",
       };
     
       for (int i = 0; i < MAX; i++)
       {
          cout << "Value of names[" << i << "] = ";
          cout << names[i] << endl;
       }
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Value of names[0] = Zara Ali
    Value of names[1] = Hina Ali
    Value of names[2] = Nuha Ali
    Value of names[3] = Sara Ali

    四、C++传递指针给函数

    C++ 允许传递指针给函数,只需要声明函数参数为指针类型即可

    实例:

    交换两个值的函数

    #include <iostream>
    using namespace std;
     
    void swap(int *p1, int *p2)
    {
        int p;
        p = *p1;
        *p1 = *p2;
        *p2 = p;
        
    }
     
    int main()
    {
        int a, b;
        int *p, *q;
        cin >> a >> b;
        p = &a;
        q = &b;
        
        swap(p, q);
        cout<< a << " "<< b;
    }

    五、从函数返回指针

    后续补充

  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/wy0526/p/15683185.html
Copyright © 2011-2022 走看看