zoukankan      html  css  js  c++  java
  • 小知识——c++关于指针的理解

    参考文章:

    简介:

    指针可以简化c++编程,在一些任务中没有指针是无法完成的(动态内存分配)

    使用 & 可以获得变量在内存中的地址:

    eg:

     1 #include <iostream>
     2  
     3 using namespace std;
     4  
     5 int main ()
     6 {
     7    int  var1;
     8    char var2[10];
     9  
    10    cout << "var1 变量的地址: ";
    11    cout << &var1 << endl;
    12  
    13    cout << "var2 变量的地址: ";
    14    cout << &var2 << endl;
    15  
    16    return 0;
    17 }
    View Code

    定义:

    指针:是一个变量,它的值是另一个变量的地址。在使用前要对它进行声明和赋值。

    空指针:

    NULL:为空指针,如果没有确切的地址可以赋值,为指针赋值一个null是一个好的习惯。

    eg:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main ()
     6 {
     7    int  *ptr = NULL;
     8 
     9    cout << "ptr 的值是 " << ptr ;
    10  
    11    return 0;
    12 }
    View Code

    执行结果是:ptr 的值是 0

    大多数操作系统中程序是不允许访问地址为0的内存。该内存视为操作系统保留的,他可以表明指针不指向一个可以访问的内存,所以如果指针包含空值就假定它不指向任何东西。

    对于空指针的的检查:

    if (ptr)   或if (!ptr)  未初始化的变量存在垃圾直,会使程序的调试难以进行。

    指针的运算:

    指针可以进行 ++、 +、 -、 -- 运算。

    如果ptr是指向1000的整形指针,ptr++是指向1004位置的指针。每增加一次往后移动4个字节,如果是字符型指针,ptr++指向1001,往后移动一个字节。

    通常使用++、 -- 是在使用指针代替数组的时候使用。

    eg:

     1 #include <iostream>
     2  
     3 using namespace std;
     4 const int MAX = 3;
     5  
     6 int main ()
     7 {
     8    int  var[MAX] = {10, 100, 200};
     9    int  *ptr;
    10  
    11    // 指针中的数组地址
    12    ptr = var;
    13    for (int i = 0; i < MAX; i++)
    14    {
    15       cout << "Address of var[" << i << "] = ";
    16       cout << ptr << endl;
    17  
    18       cout << "Value of var[" << i << "] = ";
    19       cout << *ptr << endl;
    20  
    21       // 移动到下一个位置
    22       ptr++;
    23    }
    24    return 0;
    25 }
    View Code

    编译结果:

    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

    指针的比较:

    指针可以使用关系运算符进行比较:== 、<、> 

    eg:

     1 #include <iostream>
     2  
     3 using namespace std;
     4 const int MAX = 3;
     5  
     6 int main ()
     7 {
     8    int  var[MAX] = {10, 100, 200};
     9    int  *ptr;
    10  
    11    // 指针中第一个元素的地址
    12    ptr = var;
    13    int i = 0;
    14    while ( ptr <= &var[MAX - 1] )
    15    {
    16       cout << "Address of var[" << i << "] = ";
    17       cout << ptr << endl;
    18  
    19       cout << "Value of var[" << i << "] = ";
    20       cout << *ptr << endl;
    21  
    22       // 指向上一个位置
    23       ptr++;
    24       i++;
    25    }
    26    return 0;
    27 }
    View Code

    运行结果:

    Address of var[0] = 0xbfce42d0
    Value of var[0] = 10
    Address of var[1] = 0xbfce42d4
    Value of var[1] = 100
    Address of var[2] = 0xbfce42d8
    Value of var[2] = 200

     指针数组和数组指针:

    https://www.cnblogs.com/fanhua666/p/11505078.html

    指向指针的指针:

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

    声明: int **var;

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

     1 #include <iostream>
     2  
     3 using namespace std;
     4  
     5 int main ()
     6 {
     7     int  var;
     8     int  *ptr;
     9     int  **pptr;
    10  
    11     var = 3000;
    12  
    13     // 获取 var 的地址
    14     ptr = &var;
    15  
    16     // 使用运算符 & 获取 ptr 的地址
    17     pptr = &ptr;
    18  
    19     // 使用 pptr 获取值
    20     cout << "var 值为 :" << var << endl;
    21     cout << "*ptr 值为:" << *ptr << endl;
    22     cout << "**pptr 值为:" << **pptr << endl;
    23  
    24     return 0;
    25 }
    View Code

    结果:

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

    C++ 传递指针给函数

    eg:

     1 #include <iostream>
     2 #include <ctime>
     3  
     4 using namespace std;
     5 void getSeconds(unsigned long *par);
     6  
     7 int main ()
     8 {
     9    unsigned long sec;
    10  
    11  
    12    getSeconds( &sec );
    13  
    14    // 输出实际值
    15    cout << "Number of seconds :" << sec << endl;
    16  
    17    return 0;
    18 }
    19  
    20 void getSeconds(unsigned long *par)
    21 {
    22    // 获取当前的秒数
    23    *par = time( NULL );
    24    return;
    25 }
    View Code

    结果

    Number of seconds :1294450468
    数组作为参数:
     1 #include <iostream>
     2 using namespace std;
     3  
     4 // 函数声明
     5 double getAverage(int *arr, int size);
     6  
     7 int main ()
     8 {
     9    // 带有 5 个元素的整型数组
    10    int balance[5] = {1000, 2, 3, 17, 50};
    11    double avg;
    12  
    13    // 传递一个指向数组的指针作为参数
    14    avg = getAverage( balance, 5 ) ;
    15  
    16    // 输出返回值
    17    cout << "Average value is: " << avg << endl; 
    18     
    19    return 0;
    20 }
    21  
    22 double getAverage(int *arr, int size)
    23 {
    24   int    i, sum = 0;       
    25   double avg;          
    26  
    27   for (i = 0; i < size; ++i)
    28   {
    29     sum += arr[i];
    30    }
    31  
    32   avg = double(sum) / size;
    33  
    34   return avg;
    35 }
    View Code

    结果

    Average value is: 214.4

    C++ 从函数返回指针

    函数声明:

    int * myFunction()
    {
    .
    .
    .
    }

    另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

    eg:

     1 #include <iostream>
     2 #include <ctime>
     3 #include <cstdlib>
     4  
     5 using namespace std;
     6  
     7 // 要生成和返回随机数的函数
     8 int * getRandom( )
     9 {
    10   static int  r[10];
    11  
    12   // 设置种子
    13   srand( (unsigned)time( NULL ) );
    14   for (int i = 0; i < 10; ++i)
    15   {
    16     r[i] = rand();
    17     cout << r[i] << endl;
    18   }
    19  
    20   return r;
    21 }
    22  
    23 // 要调用上面定义函数的主函数
    24 int main ()
    25 {
    26    // 一个指向整数的指针
    27    int *p;
    28  
    29    p = getRandom();
    30    for ( int i = 0; i < 10; i++ )
    31    {
    32        cout << "*(p + " << i << ") : ";
    33        cout << *(p + i) << endl;
    34    }
    35  
    36    return 0;
    37 }
    38 当上面的代码被编译和执行时,它会产生下列结果:
    39 
    40 624723190
    41 1468735695
    42 807113585
    43 976495677
    44 613357504
    45 1377296355
    46 1530315259
    47 1778906708
    48 1820354158
    49 667126415
    50 *(p + 0) : 624723190
    51 *(p + 1) : 1468735695
    52 *(p + 2) : 807113585
    53 *(p + 3) : 976495677
    54 *(p + 4) : 613357504
    55 *(p + 5) : 1377296355
    56 *(p + 6) : 1530315259
    57 *(p + 7) : 1778906708
    58 *(p + 8) : 1820354158
    59 *(p + 9) : 667126415
    View Code

    函数指针:

    文档:函数指针
    链接:

    文档:10 数组指针和指针数组的区别
    链接:http://note.youdao.com/noteshare?id=666741e0f5df0ba7beb2a97eeff1fdce&sub=wcp1565830202948624

     

     

  • 相关阅读:
    css之选择器及性能优化
    css之font
    css之background
    Oracle 学习笔记(十)
    数据库脚本开发日志模板 —— 项目需求 A
    Java 程序动态替换 docx 模板中定制值的实现例子
    Quartz 定时器 Cron 表达式 怎么破?
    Tomcat 启动报错;ERROR: transport error 202: bind failed: Address already in use
    Oracle 学习笔记(九)
    Oracle 学习笔记(八)
  • 原文地址:https://www.cnblogs.com/fanhua666/p/11504913.html
Copyright © 2011-2022 走看看