zoukankan      html  css  js  c++  java
  • c++ 指针(二)

    指针

    (4)指针数组

    #include <iostream>
     
    using namespace std;
    const int MAX = 3;
     
    int main ()
    {
       int  var[MAX] = {10, 100, 200};
     
       for (int i = 0; i < MAX; i++)
       {
          cout << "Value of var[" << i << "] = ";
          cout << var[i] << endl;
       }
       return 0;
    }
    Value of var[0] = 10
    Value of var[1] = 100
    Value of var[2] = 200

    指向整数的指针数组的声明:

    int *ptr[MAX];

    把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针

    #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

    也可以用一个指向字符的指针数组来存储一个字符串列表:

    #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

    char *names[MAX] 是指针数组, 它的本质是存储指针的数组, 既存储 char 类型的指针的数组, 数组内的每个元素都是一个指针指向一个存储 char 类型的地址: 

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

    cout<<*names[i]<<endl; 输出结果为对应得指针数组的第一个字符,因为 *name 代表指向数组的第一个地址的值

    #include <iostream>
    using namespace std;
    
    void pointerArray();
    void pointerArray4Char();
    const int MAX = 3;
    
    int main(void){
        // pointerArray();
        pointerArray4Char();
        return 0;
    }
    
    void pointerArray(){
        int var[MAX] = {20,30,40};
        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;
        }
    }
    
    /**
     * 用一个指向字符的指针数组来存储一个字符串列表
     * Value of names[0] = sun;
     */
    void pointerArray4Char(){
        const char *names[MAX] = {
                "sun","bin","sunbin"
        };
        for(int i = 0;i < MAX;i++){
            cout <<"Value of names[" << i << "] = ";//输出字符串的值
            cout << names[i] << endl;
            cout <<"Value of *names[" << i << "] = ";//输出指针所指向字符串首地址的值
            cout << *names[i] << endl;
            cout <<"Value of *names[" << i << "]+1 = ";//输出ascii码值
            cout << *names[i]+1 << endl;
            cout <<"Value of *(names[" << i << "]+1) = ";//输出指针所指向字符串首地址上一位的值
            cout << *(names[i]+1) << endl;
        }
    }

     

     char *names[MAX] 这种字符型的指针数组是存储指针的数组,但是在理解字符型指针数组的时候,可以将它理解为一个二维数组,如 const char *names[4] = {"Zara Ali","Hina Ali","Nuha Ali","Sara Ali",} 可以理解为一个 4 行 8 列的数组,可以用 cout << *(names[i] + j)<< endl 取出数组中的每个元素。

    #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++)
            for (int j = 0; j < 8; j++)
            {
                cout << "Value of names[" << i << "] = ";
                cout << *(names[i] + j)<< endl;
            }
        return 0;
    }

     结果:

    Value of names[0] = Z
    Value of names[0] = a
    Value of names[0] = r
    Value of names[0] = a
    Value of names[0] =  
    Value of names[0] = A
    Value of names[0] = l
    Value of names[0] = i
    Value of names[1] = H
    Value of names[1] = i
    Value of names[1] = n
    Value of names[1] = a
    Value of names[1] =  
    Value of names[1] = A
    Value of names[1] = l
    Value of names[1] = i
    Value of names[2] = N
    Value of names[2] = u
    Value of names[2] = h
    Value of names[2] = a
    Value of names[2] =  
    Value of names[2] = A
    Value of names[2] = l
    Value of names[2] = i
    Value of names[3] = S
    Value of names[3] = a
    Value of names[3] = r
    Value of names[3] = a
    Value of names[3] =  
    Value of names[3] = A
    Value of names[3] = l
    Value of names[3] = i

    (5)指向指针的指针

    指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

    一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:

    int **var;

    当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符

    #include <iostream>
     
    using namespace std;
     
    int main ()
    {
        int  var;
        int  *ptr;
        int  **pptr;
     
        var = 3000;
     
        // 获取 var 的地址
        ptr = &var;
     
        // 使用运算符 & 获取 ptr 的地址
        pptr = &ptr;
     
        // 使用 pptr 获取值
        cout << "var 值为 :" << var << endl;
        cout << "*ptr 值为:" << *ptr << endl;
        cout << "**pptr 值为:" << **pptr << endl;
     
        return 0;
    }

    结果:

    var 值为 :3000
    *ptr 值为:3000
    **pptr 值为:3000

     

  • 相关阅读:
    DLL相关
    设备实时监控
    VC++定时器的运用
    iOS开发多线程篇—GCD的常见用法
    iOS开发多线程篇—线程的状态
    iOS开发多线程篇—GCD介绍
    iOS开发多线程篇—线程间的通信
    iOS开发多线程篇—线程安全
    iOS开发多线程篇—创建线程
    iOS开发多线程篇—多线程简单介绍
  • 原文地址:https://www.cnblogs.com/expedition/p/11347761.html
Copyright © 2011-2022 走看看